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.