Maple
Son bon usage en mathématiques

Philippe Dumas, Xavier Gourdon

Springer-Verlag, 1997

Code Maple du Chapitre 1, Livre second.


# section 1, page 109.


r[0]:=15:                    r[0]:=x^15-1:
r[1]:=9:                     r[1]:=x^9-1:
for k while r[k]<>0 do       for k while r[k]<>0 do 
  r[k+1]:=irem(r[k-1],r[k])    r[k+1]:=rem(r[k-1],r[k],x)
od:                          od:
r[k-1];                      r[k-1];

igcd(15,9),gcd(x^15-1,x^6-1);

seq(ifactor(2^(2^k)+1),k=1..6);

igcdex(15,9,u,v),u,v;

gcdex(x^3-4,x^4+x^2+1,x,'u','v'),u,v;

a:=100:
p:=ithprime(100):
igcdex(a,p,'u','v'),u,v;

a^(-1) mod p;

# exercice 1.7, page 114.
m:=6:
for x from 0 to m-1 do for y from 0 to m-1 do
  A[x,y]:=x+y mod m 
od od:
array(1..2,1..2,
     [[cat(`+ mod `,m),matrix(1,m,[seq(i,i=0..m-1)])],
      [matrix(m,1,[seq(j,j=0..m-1)]),
       matrix(m,m,[seq(seq(A[i,j],j=0..m-1),i=0..m-1)])]]);
# fin exercice 1.7.

p:=7:
seq(binomial(p,k),k=0..p)

# exercice 1.8, page 116.
readlib(`plot/color`):
print(`plot/colortable`);
# fin exercice 1.8.

f:=x^10/(x^5-1)/(x^2+x+1);

convert(f,parfrac,x);

dec:=convert(f,fullparfrac,x);

unlikely:=proc(s) 
  local sf;
  if has(s,Sum) then
    if op(0,s)=Sum and has(op(2,s),RootOf) then
         add(sf,sf={allvalues(subs(op(2,s),op(1,s)))})
    else map(unlikely,s)
    fi
  else s
  fi
end: # unlikely
unlikely(dec):
map(radnormal,");

# exercice 1.11, page 120.
r:=1/factorial(8):
convert(r,iparfrac);

lprint(ifactor(12));
# fin exercice 1.11.

# exercice 1.15, page 122.
n:=2^73-1:
ifactor(n);

p:=nextprime(1000):
M:=2^p-1:
isprime(M);
# fin exercice 1.15.

# exercice 1.17, page 123.
m[1]:=15:
m[2]:=14:
a[1]:=2:
a[2]:=3:
z[1,1]:=a[1]:
z[2,1]:=a[2]:
for k from 2 while z[1,k-1]<>1 or z[2,k-1]<>1 do
  z[1,k]:=z[1,k-1]*a[1] mod m[1];
  z[2,k]:=z[2,k-1]*a[2] mod m[2]
od:
seq([z[1,i],z[2,i]],i=1..k-1);
k-1;
# fin exercice 1.17.

# section 3, page 124.

# probleme page 124.
evalf(333/106,50);

decimalexpansion(1/2800,20);

nicedecimalexpansion(1/2800);

x:=evalf(Pi,50):
convert(x,confrac,xx):
seq(xx[i],i=1..6);

x:=evalf(2^(1/2),50):
convert(x,confrac,'xx'):
xx;

x:=evalf(Pi,50):
convert(x,confrac,'xx'):
seq(xx[i],i=7..nops(xx));
# fin probleme.

# section 4, page 127.

# exercice 1.2, page 128.
for k to 50 do readlib(ifactors)((10^k-1)/9) od;
for k to 50 do if isprime((10^k-1)/9) then print(k) fi od;
# fin exercice 1.2.

# exercice 1.3, page 128.
for n to 20 do factor(x^n-1) od;
# fin exercice 1.3.

# exercice 1.4, page 128.
p[0]:=1:
for i while p[i-1]<100 do
  p[i]:=nextprime(p[i-1]);
  GIfactorization[i]:=[p[i],GaussInt[GIfactor](p[i])]
od:
[seq(GIfactorization[i],i=1..25)]:
subs(``(-1)=1,``(I)=1,``(-I)=1,"):
select(proc(z) evalb(nops(z[2])>1) end,");
# fin exercice 1.4.

# exercice 1.6, page 130.
isolve(100*x=2+541*k);

" mod 541;

msolve(100*x=2,541);
# fin exercice 1.6.

# exercice 1.8, page 131.
p:=3:
N:=81:
a:=[1,1,1]:b:=[0,0,0]:
for n from 0 to N do for k from 0 to n do 
  SQ:=[[k,-n],[k,-n-1],[k+1,-n-1],[k+1,-n]];                   #1
  residue:=binomial(n,k) mod p;
  t:=evalf(residue/(p-1));
  pic[n,k]:=plots[polygonplot](SQ,
            color=COLOR(RGB,op((1-t)*a+t*b)),                  #2
            view=[-2..N+1,-N-1..2]);
od od:
pic[text]:=plots[textplot]([seq([-1/2,-n-1/2,convert(n,string)],
                                n=0..N),
                            seq([k+3/4,-k+1/2,convert(k,string)],
                                k=0..N)],
                                          font=[TIMES,ROMAN,20]):
plots[display]({seq(seq(pic[n,k],k=0..n),n=0..N),pic[text]},
                                  scaling=constrained,axes=none);
# fin exercice 1.8.

# exercice 1.9, page 132.
for i to 10 do 
  p:=ithprime(1+i);
  z:=2;
  for j while z<>1 do z:=2*z mod p od;
  T[i]:=[p,j];
od:
seq(T[i],i=1..10);
# fin exercice 1.9.

# exercice 1.10, page 132.
for n from 2 to 20 do
  counter:=0;
  for a to n-1 do if igcd(a,n)=1 then 
      counter:=counter+1;
      G[n,counter]:=a                                          #1
    fi
  od;
  CardG[n]:=counter;
  g[n]:=FAIL;
  for k to CardG[n] while g[n]=FAIL do
    z:=G[n,k];
    for nu while z<>1 do z:=z*G[n,k] mod n od:
    if nu=CardG[n] then 
      g[n]:=G[n,k]                                             #2
    fi;
  od;
od:
seq([n,g[n]],n=2..20);

for k to CardG[20] do
  z:=G[20,k];
  for nu while z<>1 do z:=z*G[20,k] mod 20 od:
  NU[20,k]:=nu
od:
seq([G[20,k],NU[20,k]],k=1..CardG[20]);
# fin exercice 1.10.

# exercice 1.11, page 133.
`convert/iparfrac`:=proc(r::rational)
  local n,d,f,l,i,p,alpha,m,M,c,E,k;
  n:=numer(r);
  d:=denom(r);
  f:=readlib(ifactors)(d)[2];                                  #1
  l:=nops(f);
  for i to l do       
    p[i]:=f[i][1];                                             #2
    alpha[i]:=f[i][2];
    m[i]:=p[i]^alpha[i];
    M[i]:=iquo(d,m[i]);
    c[i]:=modp((n*M[i]^(-1)),m[i]);
    E[i]:=convert(c[i],base,p[i])                              #3
  od;
  n/d-add(c[i]/m[i],i=1..l)+add(add(                           #4
         E[i][k]/``(p[i])^(alpha[i]-k+1),k=1..nops(E[i])),i=1..l)
end: # convert/iparfrac
# fin exercice 1.11.

# exercice 1.12, page 134.
pi:=proc(x::numeric)
  local T,p,isqrtx,j;
  if x<2 then RETURN(0) fi;
  for p from 2 to x do T[p]:=true od;
  isqrtx:=floor(sqrt(x));
  for p from 2 to isqrtx do
    if T[p] then 
      for j from p*p to x by p do T[j]:=false od
    fi
  od;
  nops(subs(false=NULL,[seq(T[j],j=2..x)]))
end: # pi

newpi:=proc(x::numeric)
  local isqrtx,isqrtisqrtx,xoverisqrtx,
                                  p,T,counter,j,P,piofisqrtx,i,k;
  if x<2 then RETURN(0) fi;
  isqrtx:=floor(sqrt(x));                                      #0
  isqrtisqrtx:=floor(sqrt(isqrtx));
  xoverisqrtx:=floor(x/isqrtx);                                #1
  for p from 2 to isqrtx do T[p]:=true od;
  counter:=0; 
  for p from 2 to isqrtx do
    if T[p] then 
      counter:=counter+1;
      P[counter]:=p;    
      for j from p*p to isqrtx by p do T[j]:=false od
    fi
  od;
  piofisqrtx:=counter;                                         #2
  for i from 2 to xoverisqrtx+1 do
    for k to isqrtx do T[k]:=true od; 
    for j to piofisqrtx do
      for k from P[j]-irem((i-1)*isqrtx,P[j]) 
            to isqrtx by P[j] do T[k]:=false 
      od
    od;
    counter:=counter
                 +nops(subs(false=NULL,[seq(T[j],j=1..isqrtx)]));
  od;
  counter:=counter                                             #3
            -nops(subs(false=NULL,[seq(T[j-xoverisqrtx*isqrtx],
                               j=x+1..(xoverisqrtx+1)*isqrtx)]));
  counter
end: # newpi

for i from 2 to 6 do
  TIME[i]:=time(pi(10^i))
od;
for i from 2 to 8 do
  newTIME[i]:=time(newpi(10^i))
od;
pic[pi]:=plot([seq([i,log[10](TIME[i])],i=2..6)]):
pic[newpi]:=plot([seq([i,log[10](newTIME[i])],i=2..8)]):
plots[display]({pic[pi],pic[newpi]},scaling=constrained);
# fin exercice 1.12.

# exercice 1.13, page 137.
N:=232307310937188460801:
p:=igcd(2&^N-2 mod N,N);
# fin exercice 1.13.

# exercice 1.14, page 137.
n:=3*4*5;k:=27;
picture[circle]:=plot([cos(t),sin(t),t=0..2*Pi],
                        color=blue):
picture[ptset]:=plot([seq([cos(2*j*Pi/n),sin(2*j*Pi/n)],j=0..n)],
                           style=point,symbol=circle,color=blue):
picture[polygon]:=plot([seq([cos(2*j*k*Pi/n),sin(2*j*k*Pi/n)],
                                             j=0..n)],color=red):
plots[display]({picture[circle],picture[ptset],picture[polygon]},
                                  axes=NONE,scaling=constrained);
# fin exercice 1.14.

# exercice 1.15, page 138.
op(select(proc(z) isprime(op(1,z)) and isprime(op(2,z)) end,
                                     [seq([n,2^n-1],n=2..100)]));

p:=nextprime(1000):
M:=2^p-1:
for q from 2*p+1 by 2*p while q^2<=M and irem(M,q)<>0 do od:
q,isprime(q);
# fin exercice 1.15.

# exercice 1.16, page 138.
m[1]:=4*7:m[2]:=3^2*5:
x[1]:=12:x[2]:=17:
isolve({xx=x[1]+k[1]*m[1],xx=x[2]+k[2]*m[2]});

chrem([17,-4,-4,33],[9,5,7,16]),ilcm(9,5,7,16);
# fin exercice 1.16.

# exercice 1.17, page 139.
nu:=proc(a::integer,m::nonnegint)
  local F,l,i,z,modulus,Nu,k;
  if igcd(a,m)<>1 then 
    ERROR(`nu expects its arguments to be coprime integers`) 
  fi;
  F:=readlib(ifactors)(m)[2];
  l:=nops(F);
  for i to l do
    z:=a;
    modulus:=F[i][1]^F[i][2];
    for k while z<>1 do z:=z*a mod modulus od;
    Nu[i]:=k
  od;
  ilcm(seq(Nu[i],i=1..l))
end: # nu
# fin exercice 1.17.

# exercice 1.19, page 140.
f:=1/(x^4+x^2+1):
convert(f,parfrac,x);

dec:=unlikely(convert(f,fullparfrac,x)):
map(radnormal,dec,rationalized);
# fin exercice 1.19.