Maple
Son bon usage en mathématiques

Philippe Dumas, Xavier Gourdon

Springer-Verlag, 1997

Code Maple du Chapitre 1, Livre premier.


# section 1, page 3.

1+1;

sqrt(2);

evalf(");

evalf("",20);

seq(exp(-k/10*x)*sin(x),k=1..4);

plot({"},x=0..6*Pi,title=`sinusoides amorties`);
#plot(["],x=0..6*Pi,title=`sinusoides amorties`);

plot([exp(t)*cos(t),exp(t)*sin(t),t=-Pi..2*Pi/3],
              title=`spirale logarithmique`,scaling=constrained);

f:=x^4+x^2+1:
solve(f,x);

solve(f=0,x);

fsolve(f,x,complex);

series(tan(x),x,20);

expr:=sin(omega*t)*exp(lambda*t);

diff(expr,t);
factor(");

diff(expr,t,t);    
diff(expr,t$2);

int(expr,t);

Int(expr,t);

value(");

?plot

# section 2, page 7.

restart;

x:=2:
int(tan(x),x);

x:='x':

for k to 10 do
  diff(1/x,x$k)
od;

plot(sin(x,x=0..Pi);

?printlevel

series(1/convert([seq(1-x^k,k=1..10)],`*`),x,10);

series(1/mul(1-x^k,k=1..10),x,10);

[seq(1-x^k,k=1..10)];
convert(",`*`);
series(1/convert([seq(1-x^k,k=1..10)],`*`),x,10);

z:=exp(I*Pi/8):
bound:=20:
s:=0:
x[0]:=Re(s):
y[0]:=Im(s):
Z:=1:
for n to bound do 
  Z:=evalf(z*Z);
  s:=s+Z/n;
  x[n]:=Re(s);
  y[n]:=Im(s);
od:
pic[brokenspiral]:=plot([seq([x[n],y[n]],n=0..bound)],color=red):
pic[limitpoint]:=plot([[Re(-ln(1-z)),Im(-ln(1-z))]],color=blue,
                                      style=point,symbol=circle):
plots[display]({pic[brokenspiral],pic[limitpoint]},
                                            scaling=constrained);


# section 3, page 10.

p:=x^4+x+1;

solve(p,x);

evalf(");

sys:={x^3-y^3+x*y,x^2+y^2-1};
inc:={x,y};

fsolve(sys,inc);

expr:=int(1/(1+x^3),x);

nops(expr);

op(0,expr),[op(expr)],op(2,expr),op([2,2,1],expr);

S:=series(sin(x)^x,x):

op(0,S);op(S);

equivalent:=table([sin(x)=x,1-cos(x)=x^2/2,exp(x)-1=x]);

equivalent[ln(1+x)]:=x;

op(0,eval(equivalent));
op(eval(equivalent));

# exercice 1.5, page 12.
int(1/(x^7-x),x);
# fin exercice 1.5.

L[i];

# exercice 1.7, page 13.
L:=[seq(factor(diff(exp(-x^2),x$k)),k=1..4)];
op(L);
L[2];
# fin exercice 1.7.


convert(rationalexpr,parfrac,name);

convert(seriesexpr,polynom);

# exercice 1.8, page 13.
ci[1]:=int(1/cos(x),x);
ci[2]:=convert(ci[1],tan);
ci[3]:=convert(ci[1],exp);
ci[4]:=convert(ci[2],exp);
ci[5]:=convert(ci[1],sincos);
ci[6]:=convert(ci[3],trig);

cI[1]:=Int(1/cos(x),x);
value(");
cI[2]:=convert(cI[1],tan);
value(");
cI[3]:=convert(cI[1],exp);
value(");
cI[4]:=convert(cI[2],exp);
value(");
cI[5]:=convert(cI[1],sincos);
value(");
# fin exercice 1.8.

evalf([seq([cos(k*Pi/5),sin(k*Pi/5)],k=0..10)],4);

n:=3:
A:=matrix(3,3,[[1,2,3],[2,3,4],[4,5,6]]);
B:=linalg[transpose](A);

X:=matrix(n,n):
AX:=evalm(A&*X):
XB:=evalm(X&*B):
S:=solve({seq(seq(AX[i,j]=XB[i,j],j=1..n),i=1..n)},
                               {seq(seq(X[i,j],j=1..n),i=1..n)});

Xsol:=subs(S,evalm(X));

# exercice 1.9, page 15.
Eseq:=entries(Xsol);

Eset:=map(op,{Eseq});

indets(Eset,name);
# fin exercice 1.9.

# exercice 1.10, page 16.
";
print(x);
";
x:=2;
";
x$0;
";
# fin exercice 1.10.

# exercice 1.11, page 16.
equivalent:=table([sin(x)=x,1-cos(x)=x^2/2,exp(x)-1=x]):
# fin exercice 1.11.

Euler:=x^2+x+41;

[seq(subs(x=i,Euler),i=1..39)];

T:=[cos(u)*(2+cos(v)),sin(u)*(2+cos(v)),sin(v)];
C:=subs(u=sqrt(2)*t,v=t,T);

pic[T]:=  plot3d(T,u=0..2*Pi,v=0..2*Pi):
pic[C]:=plots[spacecurve](C,t=0..100,numpoints=1000,thickness=3):
plots[display]({pic[T],pic[C]},scaling=constrained);

subs(x=y,y=x,[x,y]);

subs({x=y,y=x},[x,y]);

# exercice 1.13, page 18.
T:=[cos(u)*(2+rho*cos(v)),sin(u)*(2+rho*cos(v)),rho*sin(v)];
pic[T]:=plot3d(subs(rho=1,T),u=0..2*Pi,v=0..2*Pi,color=black):
pic[C]:=plots[spacecurve](subs(rho=1.1,u=sqrt(2)*t,v=t,T),
                                        t=0..100,numpoints=1000,
                                        thickness=3,color=black):
plots[display]({pic[T],pic[C]},scaling=constrained);
# fin exercice 1.13.

# section 4, page 19.

whattype(exp(-x^2/2));

type(expr,t);

seq([i,type(exp(-x^2/2),i)],i=[function,algebraic,algfun,ratpoly,
                               freeof(x),exp(ratpoly),anything]);

type(2+3/2*x+x^15,polynom(rational,x));

type(Pi*x+x^5,polynom(numeric));

type(Pi*x+x^5,polynom(realcons));

# exercice 1.14, page 20.
type(sqrt(2),numeric);
type(fsolve(x^3-x+1,x),numeric);
type(fsolve(x^3-3*x+1,x),numeric);
type([fsolve(x^3-3*x+1,x)],list(numeric));
type(x:=2,equation);
type(x<=2,relation);
S:=series(sin(x),x):
type(S,`+`);
P:=convert(S,polynom):
type(P,`+`);
type(toto,name);
type(toto,string);
# fin exercice 1.14.

# exercice 1.15, page 20.
trace(type):
convert(327,base,2);
sin(1+I);
evalc(sin(1+I));
# fin exercice 1.15.

# section 5, page 21.

do od;

f:=x^3-x+1;

u:=0.5;
for n to 4 do u:=subs(x=u,f) od;

n:='n';    
n:=evaln(n);

# exercice 1.16, page 22.
for theta from 0 by Pi/10 to Pi/2 do sin(theta) od;
for k from 0 to 5 do sin(k*Pi/10) od;
for n to 5 do
  T[n]:=subs(cos(theta)=x,expand(cos(n*theta)))
od;
for n to 5 do 
  P[n]:=collect((-1)^n/2^n/n!*diff((1-x^2)^n,x$n),x) 
od;
# fin exercice 1.16.

expr:=diff((z^2+1)/(z^2-1),z);

for i in expr do antider[i]:=int(i,z) od;

i;

n:=10:
sigma:=combstruct[draw](Permutation(n));

e:=[seq(i,i=1..n)];

tau:=sigma:
for k while tau <> e do 
  tau:=subs({seq(i=sigma[i],i=1..n)},tau)
 #tau:=[seq(sigma[i],i=tau)]
od;

k;

V:=[r*cos(omega*t),r*sin(omega*t),h];

M:=map(int,V,t);

R:=matrix(3,3):
R[1,1]:=cos(phi)*cos(psi)-cos(theta)*sin(phi)*sin(psi):
R[1,2]:=subs(psi=psi+Pi/2,R[1,1]):
R[2,1]:=subs(phi=phi-Pi/2,R[1,1]):
R[2,2]:=subs(phi=phi-Pi/2,R[1,2]):
R[1,3]:=sin(phi)*sin(theta):
R[2,3]:=-cos(phi)*sin(theta):
R[3,1]:=sin(theta)*sin(psi):
R[3,2]:=sin(theta)*cos(psi):
R[3,3]:=cos(theta):
R:=map(expand,R);

diffRphi:=diff(eval(R),phi);

diffRphi:=map(diff,R,phi);

peano:=x*y*(x^2-y^2)/(x^2+y^2);

map2(diff,peano,[seq([x$(2-k),y$k],k=0..2)]):
normal(");

[seq([x$(2-k),y$k],k=0..2)];

pf:=convert(1/z^3/(1-z)^3,parfrac,z);

select(has,pf,-1+z);

remove(has,pf,-1+z);

# exercice 1.19, page 26.
complexlist:=[seq(evalc(((1+I*3^(1/2))/(3/2))^k),k=0..8)];
# fin exercice 1.19.

add(x[i],i=0..5);

add(1./n^2,n=1..100);

add(k,k=1..n);

sum(k,k=1..n):
factor(");

# exercice 1.20, page 27.
iterate:=proc(path)
  local directionlist,n,direction,newpoint,T;
  directionlist:=[[1,0],[0,1],[-1,0],[0,-1]];
  n:=nops(path);
  for direction in directionlist do
    newpoint:=[path[n][1]+direction[1],path[n][2]+direction[2]];
    if member(newpoint,path) 
    then T[direction]:=NULL
    else T[direction]:=[op(path),newpoint]
    fi;
  od;
  seq(T[direction],direction=directionlist)
end: # iterate

PATH:=[[0,0],[1,0],[1,1],[1,2],[0,2],[0,1],[-1,1],[-1,0]]:
iterate(PATH);
# fin exercice 1.20.

# section 6, page 29.

maxi:=1000:
s:=0:
for n to maxi do
  s:= s+1./n;
  if (n mod 100)=0 then print(n,`--> `,evalf(s-ln(n))) fi;
od: 
n:='n':

# exercice 1.24, page 30.
asympt(1/(n^2+1),n);
# fin exercice 1.24.

# exercice 1.25, page 30.
maxi:=1000:
s:=0:
  for n to maxi do
    s:= s+1/n;
  if (n mod 100)=0 then print(n,`--> `,evalf(s-ln(n))) fi;
  od: n:='n':
# fin exercice 1.25.

# section 7, page 31.

expr_to_seq:=proc(expr::anything) 
  expr_to_seq_aux([],expr) 
end: # expr_to_seq
expr_to_seq_aux:=proc(path,expr)
  local i,n;
  if type(expr,{name,integer})            # termination condition
  then [path,expr]               
  else 
    n:=nops(expr);                        # recursive call
    [path,op(0,expr)],
      seq(expr_to_seq_aux([op(path),i],op(i,expr)),i=1..n) 
  fi 
end: # expr_to_seq_aux

expr:=factor(diff(exp(x^2)*(x^2+1),x));

expr_to_seq(expr);

trace(expr_to_seq_aux):
expr_to_seq(expr);
untrace(expr_to_seq_aux):

# exercice 1.26, page 33.
maple_to_lisp((1-4*x)^(-1/2));
# fin exercice 1.26.

interface(verboseproc=2);
print(student[intparts]);

# exercice 1.27, page 34.
trace(member);
student[intparts](Int(x*exp(x),x),x);
# fin exercice 1.27.

convert(series(tan(x),x,10),confrac);

interface(verboseproc=2);
readlib(`convert/confrac`);

interface(verboseproc=2);
print(evalm);

evalm(x,y);

convert(13,base,2);

nu:=proc(n::nonnegint)
  if n=0 then 0
  elif type(n,even) then nu(n/2)
  else nu((n-1)/2)+1
  fi
end: # nu
nu(13);

trace(nu):
nu(13):

countnu:=proc(n::nonnegint)
  global T;
  if assigned(T[n]) then T[n]:=T[n]+1 else T[n]:=1 fi;
  if n=0 then 0
  elif type(n,even) then countnu(n/2)
  else countnu((n-1)/2)+1
  fi
end: # countnu
for n from 0 to 10 do countnu(n) od:
seq([n,T[n]],n=0..10);

remembernu:=proc(n::nonnegint)
  option remember;
  if n=0 then 0
  elif type(n,even) then remembernu(n/2)
  else remembernu((n-1)/2)+1
  fi
end: # remembernu
for n from 0 to 10 do remembernu(n) od:
R:=op(4,eval(remembernu)):
seq([n,R[n]],n=0..10);

remembernu:=subsop(4=NULL,eval(remembernu)):

# exercice 1.30, page 39.
series(exp(exp(x)-1),x,11);
add(bell(n)/n!*x^n,n=0..10);
# fin exercice 1.30.

lucas:=proc(n::nonnegint)
  option remember;
  lucas(n-1)+lucas(n-2)
end: # lucas
lucas(0):=2:
lucas(1):=1:
op(4,eval(lucas));

f(0):=1:

# exercice 1.32, page 40.
for k from 0 to 4 do
  convert(series(add(fibonacci(i)^k*t^i,i=0..20),t,20),ratpoly)
od;
# fin exercice 1.32.

# section 8, page 41.

T:=table([seq(c=evalf(c,10),c=constants)]):
T;

print(T);

op(4,ln);

op(4,eval(ln));

p[1]:=proc()
  local U,V,W;
  U:=V;
  V:=array(1..2,1..2,[[1,2],[3,4]]);
  linalg[transpose](U)
end: # p[1]
p[1]();

p[2]:=proc()
  local U,V,W;
  U:=V;
  V:=W;
  W:=array(1..2,1..2,[[1,2],[3,4]]);
  linalg[transpose](U)
end: # p[2]
p[2]();

p[3]:=proc()
  local U,V,W;
  U:=V;
  V:=W;
  W:=array(1..2,1..2,[[1,2],[3,4]]);
  linalg[transpose](eval(U))
end: # p[3]
p[3]();

# exercice 1.33, page 43.
trace(linalg[transpose]);
# fin exercice 1.33.

A:=matrix(2,2,[[0,-1],[1,0]]);

B:=subs(x=A,x^2+1);

evalm(B);

z:=(1-I)*(5+I)^4;

arctan(Im(z),Re(z));

evala((5-sqrt(2))/(3+sqrt(2)));

evala((5-RootOf(x^2-2))/(3+RootOf(y^2-2)));

alias(theta=RootOf(_Z^3+_Z+1)):
trace(evala):
evala(1/add(theta^k,k=0..5));

# section 9, page 45.

F[0]:=Int(x^(2*m+1)/(x^2-a^2)^(n+1/2),x);

G:=subs(n=3,m=2,F[0]);

value(G);

F[1]:=student[intparts](F[0],x^(2*m)/(x^2-a^2)^n);

F[2]:=map(combine,F[1],power,symbolic);

F[3]:=map(combine,F[2],power,symbolic);

F[4]:=map(expand,F[3]);

F[5]:=map(combine,F[4],power,symbolic);

evalf(int(exp(-sec(phi)),phi=0..Pi/4));

evalf(Int(exp(-sec(phi)),phi=0..Pi/4));


2 &^ (10^6) mod 3^5;

# exercice 1.37, page 48.
binomialdecomposition(22,5);
# fin exercice 1.37.

# section 10, page 48.

# exercice 1.1, page 48.
dsolve(x*diff(y(x),x)+y(x)=sin(x),y);

dsolve(x*diff(y(x),x)+y(x)=sin(x),y(x));
# fin exercice 1.1.

# exercice 1.2, page 48.
plot([sin(x),x,x-x^3/6],x=-Pi/2..Pi);

plot([sin(x),x,x-x^3/6],x=-Pi/2..Pi,color=[red,blue,green]);

plot([sin(x),x,x-x^3/6],x=-Pi/2..Pi,color=black);

L:=[sin(x),x,x-x^3/6]:
C:=[red,blue,green]:
n:=nops(L):
for i to n do
  pic[i]:=plot(L[i],x=-Pi/2..Pi,color=C[i])
od:
plots[display]({seq(pic[i],i=1..n)});
# fin exercice 1.2.

# exercice 1.3, page 49.
series(sin(x),x,10);

series(sin(x)/x,x,10);

series(1/sin(x),x,10);

series(1/sin(x)-1/x,x,10);

s[1]:=series(1/sin(x),x);

s[2]:=series(sin(x),x);

series(s[1]*s[2],x);
# fin exercice 1.3.

# exercice 1.4, page 50.
expand(cos(5*phi));

subs(cos(phi)=x,");

orthopoly[T](5,x);

solve(",x);

fsolve("",x);
# fin exercice 1.4.

# exercice 1.6, page 51.
expr:=3/2; 
op(0,expr),op(expr);

expr:=I; 
op(0,expr),op(expr);

expr:=z=sin(z/2); 
op(0,expr),op(expr);
# fin exercice 1.6.

# exercice 1.7, page 52.
L:=[seq(factor(diff(exp(-x^2),x$k)),k=1..4)];

L[2];
# fin exercice 1.7.

# exercice 1.8, page 52.
ci[1]:=int(1/cos(x),x);

ci[5]:=convert(ci[1],sincos);

cI[1]:=Int(1/cos(x),x);

cI[2]:=convert(cI[1],tan);

value(");

cI[4]:=convert(cI[2],exp);

value(");
# fin exercice 1.8.

# exercice 1.9, page 53.
indices(Xsol);

Eset:=map(op,{Eseq});

indets((ln(x+sqrt(exp(x)+1))+x)/(x+sin(x*y)));

indets(convert(Xsol,set));
# fin exercice 1.9.

# exercice 1.11, page 53.
seq([i],i=eval(equivalent));
# fin exercice 1.11.

# exercice 1.13, page 54.
K:=[rho*u*cos(v),rho*u*sin(v),2*u];
pic[K]:=plot3d(subs(rho=1,K),u=-1..1,v=0..2*Pi,color=black):
pic[H]:=plots[spacecurve](subs(rho=1.1,u=t,v=10*t,K),t=-1..1,
                           numpoints=50,thickness=3,color=black):
plots[display]({pic[K],pic[H]},orientation=[70,85],
                                            scaling=constrained);
# fin exercice 1.13.

# exercice 1.14, page 54.
type(sqrt(2),numeric);

fsolve(x^3-x+1,x),type(fsolve(x^3-x+1,x),numeric);

fsolve(x^3-3*x+1,x),type(fsolve(x^3-3*x+1,x),numeric);

type([fsolve(x^3-3*x+1,x)],list(numeric));

type(x:=2,equation);

type(x<=2,relation);

S:=series(sin(x),x):
op(0,S);
op(S);

type(S,`+`);

P:=convert(S,polynom):
type(P,`+`);

series((1+x)^x,x);
lprint(");
series((1+sqrt(x))^x,x);
lprint(");
type(",`+`);
# fin exercice 1.14.

# exercice 1.15, page 56.
untrace(type);
# fin exercice 1.15.

# exercice 1.17, page 56.
Digits:=25:
olda:=1.: oldb:=sqrt(2.):
while abs(olda-oldb)>10^(-20) do
  newa:=(olda+oldb)/2;
  newb:=sqrt(olda*oldb);
  olda:=newa;
  oldb:=newb;
od:
M:=(olda+oldb)/2:
1/M;

evalf(2/Pi*Int(1/sqrt(1-t^4),t=0..1));
# fin exercice 1.17.

# exercice 1.18, page 57.
H:=0:
for n while H<=10 do H:=evalf(H+1/n) od:
n,H;
# fin exercice 1.18.

# exercice 1.19, page 57.
complexlist:=[seq(evalc(((1+I*3^(1/2))/(3/2))^k),k=0..8)];
pointlist:=map(proc(z) [Re(z),Im(z)] end,complexlist);
plot(pointlist,scaling=constrained);
# fin exercice 1.19.

# exercice 1.20, page 57.
T[0]:=1:
pathlist:=[[[0,0]]]:
nmax:=10:
for n to nmax do 
  pathlist:=map(iterate,pathlist);
  T[n]:=nops(pathlist)
od:
seq(T[n],n=0..nmax);

for n from 1 to 9 do evalf(T[n+1]/T[n]) od;
# fin exercice 1.20.

# exercice 1.21, page 58.
for p to 10 do 
    factor(sum(k^p,k=1..n))
od;
# fin exercice 1.21.

# exercice 1.22, page 58.
m:=5:
for i to m do
    p[i]:=1/mul(1-lambda[i]/lambda[j],j=1..i-1)
           /mul(1-lambda[i]/lambda[j],j=i+1..m)
od:
for k to m-1 do s[k]:=add(lambda[i]^k*p[i],i=1..m) od:

seq(normal(s[k]),k=1..m-1);

restart:
p:=1/product(1-lambda[i]/lambda[j],j=1..i-1)
           /product(1-lambda[i]/lambda[j],j=i+1..m):
s:=sum(lambda[i]^k*p[i],i=1..m):

for k to m-1 do indets(s[k]) od;

indets(s);
# fin exercice 1.22.

# exercice 1.23, page 59.
for n to 50 do
    convert(map(proc(pair) 1/pair[1]/pair[2] end,
                select(proc(pair)
                              evalb((pair[1]n) 
                         and (igcd(pair[1],pair[2])=1)) end,
                       [seq(seq([p,q],q=2..n),p=2..n)])),
            `+`)
od;

for n to 50 do
     convert(map(proc(pair) 1/pair[1]/pair[2] end,
                 select(proc(pair)
                          evalb((igcd(pair[1],pair[2])=1))
                        end,
                  [seq(seq([p,q],q=max(p+1,n+1-p)..n),p=2..n)])),
             `+`)
od;

for n to 50 do
  s[n]:=0;
  for p from 2 to n do 
    for q from max(p+1,n+1-p) to n do 
      if igcd(p,q)=1 then s[n]:=s[n]+1/p/q fi
    od
  od;
od:
seq([n,s[n]],n=1..50);
# fin exercice 1.23.

# exercice 1.24, page 60.
da:=asympt(Psi(n+1),n);

subs(n=1000,da);

op(0,da),op(da);

subs(n=1000,O=0,[op(da)]);

evalf(");
# fin exercice 1.24.

# exercice 1.26, page 61.
maple_to_lisp:=proc(expr::anything)
  local i;
  if type(expr,{name,integer}) then expr
  else [op(0,expr),seq(maple_to_lisp(op(i,expr)),i=1..nops(expr))]
  fi
end: # maple_to_lisp

n:=evalc((1-2*I)^3);
expr_to_seq(n);
maple_to_lisp(n);

absn:=abs(n);
expr_to_seq(absn);
maple_to_lisp(absn);

exprtrig:=combine(cos(x)^3,trig);
expr_to_seq(exprtrig);
maple_to_lisp(exprtrig);

A:=array(symmetric,1..2,1..2,[(1,1)=x,(1,2)=y,(2,2)=z]);
expr_to_seq(A);
expr_to_seq(eval(A));
maple_to_lisp(eval(A));

B:=array(1..2,1..2,[[a,b],[c,d]]);
expr_to_seq(eval(B));
maple_to_lisp(eval(B));
# fin exercice 1.26.

# exercice 1.27, page 61.
untrace(member);
# fin exercice 1.27.

# exercice 1.28, page 61.
permutation_order_1:=proc(sigma::list(posint))
  local n,e,tau,k,i;
  n:=nops(sigma);
  e:=[seq(i,i=1..n)];
  if {op(sigma)}={op(e)} then
    tau:=sigma;
    for k while tau <> e do tau:=[seq(sigma[i],i=tau)] od;
    k;
  else ERROR(`expected a permutation of [1,`,n,`],
                                             but received`,sigma)
  fi
end: # permutation_order_1

`type/permutation`:=proc(sigma)
  local i;
  type(sigma,list(posint)) and
    {op(sigma)}={seq(i,i=1..nops(sigma))}
end: # type/permutation
permutation_order_2:=proc(sigma::permutation)
  local n,e,tau,k,i;
  n:=nops(sigma);
  e:=[seq(i,i=1..n)];
  tau:=sigma;
    for k while tau <> e do tau:=[seq(sigma[i],i=tau)] od;
  k;
end: # permutation_order_2

sigma:=[1,2,7,4,5,6];
permutation_order_1(sigma);

permutation_order_2(sigma);
# fin exercice 1.28.

# exercice 1.29, page 62.
op(4,eval(evalf));
# fin exercice 1.29.

# exercice 1.30, page 63.
bell:=proc(n::nonnegint)
  local minus1,k;
  option remember;
  if n=0 then 1
  else 
    minus1:=n-1;
    add(binomial(minus1,k)*bell(k),k=0..minus1)
  fi
end: # bell
seq(bell(n),n=0..10);

bell:=proc(n::nonnegint)
  local minus1,k;
  option remember;
  minus1:=n-1;
  add(binomial(minus1,k)*bell(k),k=0..minus1)
end: # bell
bell(0):=1:
# fin exercice 1.30.

# exercice 1.31, page 63.
directnu:=proc(n::nonnegint)
  #local i;
  convert(convert(n,base,2),`+`)
  #add(i,i=convert(n,base,2));
end: # directnu
directnu(13);
# fin exercice 1.31.

# exercice 1.32, page 64.
fibonacci:=proc(n::nonnegint)
  option remember;
  fibonacci(n-1)+fibonacci(n-2)
end: # fibonacci
fibonacci(0):=1:
fibonacci(1):=1:

coeff_a:=proc(k::nonnegint,j::nonnegint)
  local m;
  option remember;
  if j=0 then 
    if k=0 then 1 else 0 fi
  else
    add(coeff_a(m,j-1)*fibonacci(k-m-2),m=0..k-2)
  fi
end: # coeff_a

Phi:=proc(k::nonnegint)
  option remember;
  normal((1+k*t*add((-1)^j*coeff_a(k,j)/j*
                     subs(t=(-1)^j*t,Phi(k-2*j)),j=1..iquo(k,2)))
                                      /(1-lucas(k)*t+(-1)^k*t^2))
end: # Phi
Phi(0):=1/(1-t):
Phi(1):=1/(1-t-t^2):

seq(Phi(k),k=0..3);
# fin exercice 1.32.

# exercice 1.33, page 64.
for i to m do for j to n do B[i,j]:=A[j,i] od od;
# fin exercice 1.33.

# exercice 1.34, page 65.
evalc((7+I)^5*(79+3*I)^2);
# fin exercice 1.34.

# exercice 1.35, page 65.
T[0]:=Int(cos(x)^n*sin(x)^m,x);
T[1]:=student[intparts](T[0],cos(x)^n*sin(x)^(m-1));

T[2]:=expand(T[1]);
T[3]:=combine(T[2],power,symbolic);
# fin exercice 1.35.

# exercice 1.36, page 65.
R:=Int(arctan(t)/t,t=0..x);

evalf(subs(x=1,R));

plot(R,x=-1..1);

series(R,x,10);
evalf(Sum((-1)^n/(2*n+1)^2,n=0..infinity));
# fin exercice 1.36.

# exercice 1.37, page 66.
binomialdecomposition:=proc(N::nonnegint,l::posint)
  local k,counter;
  if N=0 then add(Binomial(k-1,k),k=1..l)
  elif l=1 then Binomial(N,1)
  else for counter while binomial(counter,l)<=N do od;
    Binomial(counter-1,l)
      +binomialdecomposition(N-binomial(counter-1,l),l-1)
  fi
end: # binomialdecomposition

`value/Binomial`:=proc(expr)
  subs(Binomial=binomial,expr)
end: # value/Binomial
# fin exercice 1.37.