 restart;maple_mode(1);
 
/*  -------------------------------------EXERCICE-----------------------------------------*/
 l:=[];
 for n from 10^4 to 10^5 by 1000  do l:=[op(l),[n,time(27^(2^n) mod 107)(1)]] ; od:
/*  Le coup semble lineaire (en n) sur ce dessin, ce qui illustre bien que le£ calcul de 27^A est en O(ln(A))*/
 rl:=[linear_regression(l)]:
 plotlist(l):line(y=rl[1]*x+rl[2],color=green):
/* On aurait pu utiliser directement linear_regression_plot pour faire le dessin.*/
 correlation(l):
 puis:=proc(a,n)
 local A,B,C;
 A:=1;B:=a;C:=n;
 while C>0 do
 if irem(C,2)=1 then A:=A*B;C:=(C-1)/2;B:=B*B;
 else C:=(C)/2;B:=B*B;
 fi;
 od;
 A;
 end;
 puis(2,7);
 puis(2,71);
 convert(71,base,2);

/* --------------------------------------Exercice---------------------------------------------------*/
8*2+7 mod 7; (8*2+7) mod 7; #Attention mod est prioritaire sous xcas
/*  Si a=1, on a x_n=x_0+n.c [m], on fait donc par exemple: c=7,x0=1*/
l:=[seq((n*7+1) mod 1001,n=1..100)];
histogram(classes(l,0,1001/20)); #C'est tout a fait plat. Trop!
/*  Remplacer les crochets par des incolades cree un ensemble, ce qui simplifie£ automatiquement les elements egaux  */
 nops(l);nops({op(l)}); #ils sont tous distincts
 l:=[seq(rand(1001),n=1..100)];
 histogram(classes(l,0,1001/5));
 histogram(classes(l,0,1001/20));  
 nops(l);nops({op(l)});#il y a bien des anniversaires identiques
/*  On a en fait 1001^100 suites possibles, et 1001!/901! suites dont£ tous les termes sont distincts.*/
 1001!/901!/1001.^100;
x:=1; a:=237;c:=54321;m:=10^4; l:=[];
for i from 1 to 500  do x:=(a*x+c) mod m; l:=[op(l),x] ; od:
l1:=[seq(i mod 10^2,i=l)];
l2:=[seq(trunc(i/10^2),i=l)];
histogram(classes(l1,0,5));
histogram(classes(l2,0,5));
l1:=[seq(i mod 10,i=l)];
histogram(classes(l1,0,1));
/* Si d est un diviseur de m et que $y_n=x_n [d]$, alors $y_{n+1}=ay_n+c [d]$£Donc si d=10^2, les 2 derniers chiffres de x_n ont p\'eriode d'au plus d.*/
 x:=1; a:=237;c:=54321;m:=10^4-1; l:=[];
 for i from 1 to 500  do x:=(a*x+c) mod m; l:=[op(l),x] ; od:
 l1:=[seq(i mod 10^2,i=l)];
 l2:=[seq(trunc(i/10^2),i=l)];
 histogram(classes(l1,0,5));
histogram(classes(l2,0,5));
 l1:=[seq(i mod 10,i=l)];
 histogram(classes(l1,0,1));
 x:=1; a:=237;c:=54321;m:=prevprime(10^4); l:=[];
 for i from 1 to 500  do x:=(a*x+c) mod m; l:=[op(l),x] ; od:
 l1:=[seq(i mod 10^2,i=l)];
 l2:=[seq(trunc(i/10^2),i=l)];
 histogram(classes(l1,0,5));
histogram(classes(l2,0,5));
 l1:=[seq(i mod 10,i=l)];
 histogram(classes(l1,0,1));
x:=1; a:=237;c:=54321;m:=10; l:=[];
for i from 1 to 100  do x:=(a*x+c) mod m; l:=[op(l),x] ; od:
histogram(classes(l,0,1)); #certaines valeurs ne sont pas atteintes.
 periode:=proc(a)
 x:=1;p:=1;
 if (a mod 5 <> 0) then while x>0 do p:=p+1;x:=(a*x+1) mod 125; od; fi;
 p; end proc;
 periode(1),periode(5); #verification
 l:=seq(periode(i),i=2..124);max(l);
/*  On a: x_n=(a^n-1)/(a-1) mod m, donc la periode est l'ordre de a.*/
