% Basic stuff
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[a4paper, total={6.5in, 9.5in}]{geometry}
\usepackage[bookmarks, hidelinks, unicode]{hyperref}
\usepackage[]{amsmath,amssymb}
\usepackage{stmaryrd}
\usepackage{tikz}
\usepackage{lmodern}
\usepackage{soul}
\usepackage{cancel}
\usepackage{float}
\usepackage{minted}
\usepackage{multicol}
%\usepackage{unicode-math}

% Packages configuration
\usetikzlibrary{shapes.arrows, angles, quotes}
\renewcommand{\arraystretch}{1.4}
\restylefloat{table}

% Shortcut commands
\newcommand{\im}{\text{Im}\,}
\newcommand{\re}{\text{Re}\,}
\newcommand{\img}{\text{Img}\,}
\newcommand{\R}{{\mathbb R}}
\renewcommand{\C}{{\mathbb C}}
\newcommand{\N}{{\mathbb N}}
\newcommand{\Z}{{\mathbb Z}}
\newcommand{\Q}{{\mathbb Q}}
\renewcommand{\U}{{\mathbb U}}
\newcommand{\cC}{{\mathcal C}}
\newcommand{\cD}{{\mathcal D}}
\newcommand{\cF}{{\mathcal F}}
\newcommand{\cotan}{\operatorname{cotan}}
\newcommand{\conj}[1]{\overline{#1}}
\newcommand{\Aff}{\text{Aff}}
\newcommand{\twoRows}[1]{\multirow{2}{*}{#1}}
\newcommand{\threeRows}[1]{\multirow{3}{*}{#1}}
\newcommand{\twoCols}[1]{\multicolumn{2}{c|}{#1}}
\newcommand{\threeCols}[1]{\multicolumn{3}{|c|}{#1}}
\newcommand{\twoColsNB}[1]{\multicolumn{2}{c}{#1}}
\newcommand{\goesto}[2]{\xrightarrow[#1\:\to\:#2]{}}
\newcommand{\liminfty}{\lim_{x\to+\infty}}
\newcommand{\limminfty}{\lim_{x\to-\infty}}
\newcommand{\limzero}{\lim_{x\to0}}
\newcommand{ \const}{\text{cste}}
\newcommand{\et}{\:\text{et}\:}
\newcommand{\ou}{\:\text{ou}\:}
\newcommand{\placeholder}{\diamond}
\newcommand{\mediateur}{\:\text{med}\:}
\newcommand{\milieu}{\:\text{mil}\:}
\newcommand{\vect}[1]{\overrightarrow{#1}}
\newcommand{\point}[2]{(#1;\;#2)}
\newcommand{\spacepoint}[3]{\begin{pmatrix}#1\\#2\\#3\end{pmatrix}}
\newcommand{\sh}{\operatorname{sh}}
\newcommand{\ch}{\operatorname{ch}}
\renewcommand{\th}{\operatorname{th}}
\newcommand{\id}{\operatorname{id}}
\renewcommand{\cong}{\equiv}
\newcommand{\converges}[2]{\xrightarrow[{#1\to #2}]{}}
\newcommand{\convergedby}[2]{\xleftarrow[{#1\to #2}]{}}

\newcommand{\singlecomparison}[2]{%
\begin{table}[H]
	\centering
	\begin{tabular}{p{7.5cm}|p{7.5cm}}
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
#1
\end{minted}
\end{minipage}
       & #2
\end{tabular}
\end{table}
}

\newenvironment{python}{%
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
}{%
\end{minted}
\end{minipage}
}

% Document
\begin{document}
\pagestyle{empty}
{\footnotesize Ewen Le Bihan, 2020}

\vfill
{\LARGE
\[
	\text{progra}\cancel{\text{mmation}}\text{maths}
\] \\
}
\begin{center}
	Rapprocher les deux
\end{center}
\vfill
\begin{center}
{\small \url{https://ewen.works/programath} }
\end{center}

\newpage
\pagestyle{plain}
\section{\texttt{=} vs \texttt{==}}
En maths, on note indifféremment le = de la \textbf{déclaration} et le = de l'\textbf{hypothèse}.

\begin{itemize}
	\item Ce que j'appelle le \emph{= de la déclaration}, c'est celui qu'on utilise pour poser une variable: "Soit $a = 45$".
	\item Ce que j'appelle le \emph{= de l'hypothèse}, c'est le = dont on n'est pas sûr, celui que l'on veut prouver ou réfuter: "Supposons $b = c+d$".
\end{itemize}

En programmation, ce que l'on dit est interprété par une machine, qui ne peut pas déduire cette différence cruciale toute seule.
On est donc obligé de noter les "deux =" différement:

\begin{table}[h]
	\centering
	\begin{tabular}{p{7.5cm}|p{7.5cm}}
Python & Math \\\hline
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
a = 45
\end{minted}
\end{minipage}
       & Soit $a = 45$ \\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
a == 45
\end{minted} 
\end{minipage} & $a = 45$ \\

\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
P = a == 45
\end{minted} 
\end{minipage} & Soit $P$ la propriété "$a = 45$" \\
\multicolumn{2}{c}{Pour que ça ressemble comme deux gouttes d'eau aux propriétés dans une récurrence:}\\

\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
def P(n):
	return n == 2*n
\end{minted} 
\end{minipage} & Soit $P(n) = (n = 2n)$ \\
\end{tabular}
\end{table}


Comme en programmation on pose (ie on déclare) plus que l'on ne teste, le "=" tout simple sert de "= de la déclaration".
\paragraph{}
{\footnotesize{D'ailleurs, les propriétés c'est comme les relations, c'est des fonctions à valeurs dans $\mathbb{B}$ mais shhhh\ldots}}
\section{Syntaxe de base}
+, $\times$ et tout ça.
\begin{table}[h]
	\centering
	\begin{tabular}{p{7.5cm}|p{7.5cm}}
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
(1 + 2) * 3 - 4**6
\end{minted}
\end{minipage}
       & $(1+2)\cdot 3 - 4^6$ \\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
a//b + a/b
\end{minted} 
\end{minipage} & $\displaystyle \left\lfloor \frac{a}{b} \right\rfloor + \frac{a}{c}$ \\

\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
r = a%b
\end{minted}
\end{minipage}
       & Posons $r$ tel que $a = \left\lfloor \frac{a}{b} \right\rfloor b + r$ \\
\hline
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
from math import sqrt 
sqrt(5) 
\end{minted}
\end{minipage}
       & $ \sqrt{5}  $ \\
\end{tabular}
\end{table}

\section{Ensembles, intervalles}

Attention, je parle dans cette partie des \emph{ensembles}, et pas des listes en Python. 
Les ensemble ça existe aussi en Python, et c'est très similaire aux ensembles en maths:
\begin{itemize}
	\item Ça se note \texttt{\{1, 2, 3\}} (au lieu de \texttt{[1, 2, 3]})
	\item Il n'y a aucun doublon dans l'ensemble (chaque élément est différent)
	\item Il n'y a pas de notion d'ordre des éléments (on a \texttt{\{2, 4\} = \{4, 2\}})
\end{itemize}

Bien sûr, tout s'adapte aux listes, c'est juste qu'avec des ensembles c'est plus simple pour faire des parallèles avec les maths.
{\footnotesize
Pour les spés, on peut considérer la liste en Python comme une matrice-ligne
(avec une seule ligne et $n$ colonnes). Mais j'ai pas fait spé donc je vais éviter de dire des conneries, je reste sur des parallèles Python/maths avec des ensembles.
}

\begin{table}[H]
	\centering
	\begin{tabular}{p{7.5cm}|p{7.5cm}}
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
range(a, b)
\end{minted}
\end{minipage}
       & $\llbracket a, b \llbracket$ \\

\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
len(A)
\end{minted}
\end{minipage}
       & $\#A$\\ 
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
{ 2*a for a in A }
\end{minted}
\end{minipage}
       & $ \{2a,\ a \in A\}$ \\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
{ a for a in A if a**2 == a/2 }
\end{minted}
\end{minipage}
       & $ \{a \in A,\ a^2 = \frac{a}{2}\}$ \\
\multicolumn{2}{c}{Une version qui mélange les deux} \\

\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
{ f(a) for a in A if P(a) }
\end{minted}
\end{minipage}
       & $ \{f(a),\ a \in A,\ P(a)\}$ \emph{(pas vraiment légal mais on l'a utilisé une fois)}  \\
\end{tabular}
\end{table}

\section{Opérateurs sur les ensembles}

Là, pas d'équivalents pour les listes

\begin{table}[H]
	\centering
	\begin{tabular}{p{7.5cm}|p{7.5cm}}
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
A | B
\end{minted}
\end{minipage}
       & $A \cup B$\\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
A & B
\end{minted}
\end{minipage}
       & $A \cap B$\\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
A ^ B
\end{minted}
\end{minipage}
       & $A \Delta B$\\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
A - B
\end{minted}
\end{minipage}
       & $A \setminus B$\\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
A < B <= C > D >= E
\end{minted}
\end{minipage}
       & $A \subsetneq B \subset C \supsetneq D \supset E$\\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
b in B # Marche aussi avec les listes
\end{minted}
\end{minipage}
       & $b \in B$\\
\end{tabular}
\end{table}
%\subsection{\texttt{[]} vs \texttt{\{\}}}


\section{Fonctions}

\begin{table}[H]
	\centering
	\begin{tabular}{p{7.5cm}|p{7.5cm}}
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
def f(x):
	return 2 * x**2 + 5
\end{minted}
\end{minipage}
       & Soit $f = x\mapsto 2x^2+5$ \\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
def f(x, y):
	return 2 * x**2 + 5/y
\end{minted} 
\end{minipage} 
	   & Soit $f = (x, y)\mapsto 2x^2+\frac{5}{y}$ \\
\multicolumn{2}{c}{Un petit bonus}\\
\begin{minipage}{0.5\linewidth}
\begin{minted}{python}
def f(x: int, y: float) -> float:
	return 2 * x**2 + 5/y
\end{minted} 
\end{minipage} 
	   & Soit $f = \begin{cases}
		   \Z \times \R &\to \R\\
			(x, y)&\mapsto 2x^2+\frac{5}{y}
		\end{cases}$ \\& {\footnotesize (Techniquement il faudrait dire "Soit $\mathbb{F}$ l'ensemble des nombre flottants" et remplacer $\R$ par $\mathbb{F}$)}
\end{tabular}

\end{table}

\section{Variables liées et libres}

Vous vous rappelez le truc chelou de la marmite, et le fait qu'on est pas accès aux variables déclarées dans des fonctions en dehors de celles-ci? Et bah y'a tout pareil en maths enfait.

\begin{minted}{python}
	a = 5
	def f(x, y):
		return a + x*y
\end{minted}

Ici, en dehors de \texttt{f}, impossible d'accéder à \texttt{x} ou \texttt{y}, ils n'existent pas.
Par contre, on peut accéder à \texttt{a} dans \texttt{f}, ou en dehors bien sûr.\\

\paragraph{}
Et bah en maths aussi c'est pareil:
\paragraph{}
\fbox{
	\begin{minipage}{\dimexpr\textwidth-2cm}
	Soit $a = 5$. Notons $f = (x, y) \mapsto a+xy$. \\
	\textbf{Ainsi $x = 666$}
	\end{minipage}
}
\paragraph{}
Dans la définition de $f$, on utilise $a$ sans problème, par contre, dans la ligne d'après\ldots
\vspace{.5cm}
\\{\Large{WHAT‽}}
\\{\large{Mais \emph{qui} est $x$ ?}}
\\\paragraph{}
Pas de raison que ce soit différent en programmation, 
\texttt{x} et \texttt{y} sont sont des variables \emph{liées} par "\texttt{def~f(\textbf{\underline{x},~\underline{y}}):}"
de la même manière que $x$ et $y$ sont liées par "$(\underline{x}, \underline{y}) \mapsto$"



%\singlecomparison{a = 4; b = lambda x: x+5}{Soit $a = 4$. Soit $b = x\mapsto x+5$}

\end{document}

