Calcul symbolique : Leçon 7
Patterns

Compléments sur les fonctions

Comment enregistrer les valeurs d’une fonction

Clear[F1]
F1[n_]:=If[n<2,1,F1[n-1]+F1[n-2]]
Table[F1[n],{n,0,10}]

Clear[F2]
F2[0]=1
F2[1]=1
F2[2]=3
F2[n_]:=F2[n-1]+F2[n-2]
Table[F2[n],{n,0,10}]

Trace[F1[4]]
Trace[F2[4]]

Timing[F1[30]][[1]]
Timing[F2[30]][[1]]

Clear[F3]
F3[0]=1
F3[1]=1
F3[n_]:=F3[n]=F3[n-1]+F3[n-2]

F3[5]

??F3

Table[F3[n],{n,0,10}]

Trace[F3[10]]

Timing[F3[30]][[1]]

??F3

Exercice : Polynome de Fibonacci (Subscript[F, n])(x)=1 si n<2 et (Subscript[F, n])(x)=x (Subscript[F, n-1])(x)+(Subscript[F, n-2])(x) pour n>1.

Fonction d’Ackerman

Programmer la fonction d’Ackerman A(m,n) définie par 
	A(0,n)=n+1
	A(m,0)=A(m-1,1) si m>0
	A(m,n)=A(m-1,A(m,n-1)) si m>0 et n>0
	
Calculer A[0,n], A[1,n], A[2,n] pour n≤10
Calculer A[3,n] pour n≤10
Calculer A[4,1]
Calculer A[5,1]

Solution

Table[Ackermann[i,j],{i,0,2},{j,1,10}]//TableForm

Table[Ackermann[3,i],{i,1,10}]

Ackermann3[4,1]
Ackermann3[4,2]

Ackermann[5,1]

Introductions aux patterns

Blank Pattern ou _

Range[10]/.x_->x^2

TreeForm[Expand[(1+x)^3]]
Expand[(1+x)^3]/.i_Integer->2i

Expand[(1+x)^3]/.x^i_Integer->y^(2i)

Contraintes supplémentaires sur les patterns _Integer, _?, /;, |

Lire la documentation et tester sur des exemples

Cases[{3,-4,-5.1,-2},x_Integer/;x<0]

Cases[{1,2,3.5,x,y,4},_?NumberQ]

Cases[Expand[(1+x)^10],_Integer x^i_?EvenQ|x^i_?EvenQ|_Integer]

Remplacer x par y^2 dans une expression
Remplacer x^k par y^k ou z^k selon que k est pair ou impair  (penser à gérer également x = x^1)

exp=Expand[(1+x)^7]/Expand[(1-x)^6]
exp/.{x^i_?EvenQ->y^i,x^i_?OddQ->z^i}

Remplacer x  par y dans une expression mais pas x^2,x^3 ...

Comparer Select et Cases. Tester sur des exemples.

Select[{1,2,4,7,6,2},#>2&]

MatchQ, Count, DeleteCases,Position

Lire la documentation et tester sur des exemples

Expliquer le comportement de la fonction suivante

Clear[f];
f[n_Integer?PrimeQ]:=2 n;
f[n_Integer?(!PrimeQ[#]&)]:=3 n;
f[q_Rational?(EvenQ[Denominator[#]]&)]:=1 / Denominator[q];
f[x_?NumericQ]:=x;

f/@{3,4,3/8,3/7,Pi,a}

NumericQ[Pi]

Programmer la fonction de Collatz Collatz(n)=n/2 si n est pair, et 3n+1 si n est impair. Expérimentez la conjecture de Collatz à l’ordre 20

Solution

Dérivation  formelle par rapport à x : Ecrire Diffx

On veur écrire une fonction diffx qui dérive n’importe quoi (ou presque) par rapport à x. On utilisera les possibilités de définir une fonction à partir de patterns.

Solution

a=Sqrt[(1+x^(3/2))]/(1+x^2);
Factor[Diffx[a]]==Factor[D[a,x]]

FullForm[Sqrt[x]]

Diffx[Total[Table[x^(1/i),{i,1,5}]]]

Diffx[Sin[(x^2+x+1)/(1+x^2)]]

Diffx[E^x]

Diffx[(x-1)^(x+1)]

D[(x-1)^(x+1),x]