Les fractions continues

# Chapitre 13 Les fractions continues

`Définition` Une fraction continue est une expression de la forme :
`a``1``+``b``1``/a``2``+``b``2``/a``3``+``b``3``/a``4``+...`
avec pour k>1 ak>0 et pour k≥ 1 bk>0 Une fraction continue simple est une fraction continue où les bk=1, c’est donc une expression de la forme :
`a``1``+``1/a``2``+``1/a``3``+``1/a``4``+...`
Ici on ne s’intéressera qu’aux fractions continues simples car sinon l’écriture n’est pas unique, par exemple : `√``13``=3+``4/6+``4/6+``4/6+...``=`
`2+``9/4+``9/4+``9/4+...``=`
`3+``1/1+``1/1+``1/1++``1/1++``1/6+...`
`Notation` Si `n=a``1``+``1/a``2``+``1/a``3``+``1/a``4``+...`
on notera :
n=([a1,a2,...an,..],[]) si le développement n’est pas périodique et
n=([a1,a2,...as],[b1,b2,...bt]) si le développement est périodique de période [c1,c2,...ct] ie lorsque n=[a1,a2,...as,c1,c2,...ct,c1,c2,...ct,c1....]
Par exemple :
`√``13``=([3,1,1,1,1,6],[1,1,1,1,6])`

`Propriétés`
Un nombre rationnel a un développement en fraction continue fini.
Les réels qui ont un développement en fraction continue périodique sont solution d’une équation du second degré à coefficients dans ℕ.
`Le programme` :

    f2dfc(x,n):={
    local r,q,lq,lr,p,j;
    q:=floor(x);
    r:=normal(x-q);
    lq:=[];
    lr:=[];
    for (j:=1;j<=n;j:=j+1) {
    lq:=concat(lq,q);
    if (x==q){return (lq,[]);}
    p:=member(r,lr);
    if (p) {return (lq,mid(lq,p))};
    lr:=concat(lr,r);
    x:=normal(1/r);
    q:=floor(x);
    r:=normal(x-q);
    }
    return (concat(lq,x),[]);
    };

    dfc2f1(d,t):={
    local s,st,x,l,xt,k;
    s:=size(d);
    x:=d[s-1];
    for (k:=s-2;k>=0;k:=k-1) {x:=normal(d[k]+1/x);}
    if (t==[]) {return normal(x);}
    st:=size(t);
    purge(y);
    xt:=t[st-1]+y;
    for (k:=st-2;k>=0;k:=k-1) {xt:=normal(t[k]+1/xt);}
    l:=solve(y=1/xt,y);
    if (l[0]>0){y:=normal(l[0]);}else{y:=normal(l[1]);};
    x:=d[s-1]+y;
    for (k:=s-2;k>=0;k:=k-1) {x:=normal(d[k]+1/x);}
    return(normal(x));
    };
    dfc2f2(d,t):={
    local s,st,x,xt;
    s:=size(d);
    x:=d[s-1];
    for (k:=s-2;s>=0;s:=s-1) {x:=d[k]+1/x;}
    if (t==[]) {return x;}
    st:=size(t);
    xt:=t[st-1];
    for (k:=st-2;st>=0;st:=st-1) {xt:=st[k]+1/xt;}
    return(x+1/2*(sqrt(xt^2+4)-xt));
    };