next up previous contents index
suivant: La fonction dfc2r monter: Les programmes précédent: Les programmes   Table des matières   Index

La fonction r2dfc

r2dfc(alpha,n) qui transforme un réel alpha en son développement en fraction continue et qui renvoie deux listes, soit :
- $ \tt [a_0,a_1...a_p],[]$ avec $ \tt p \leq n$ où les $ \tt a_j$ sont des entiers, la deuxième liste est vide et la première liste est le développement en fraction continue de alpha (les $ \tt a_j$ sont des entiers et donc alpha est une fraction)
- $ \tt [a_0,a_1...a_{n-1},b],[]$, la deuxième liste est vide et la première liste est le développement en fraction continue d'ordre n - 1 de alpha suivi de $ \tt b>1$ (le reste est égal à $ \tt 1/b$), où les $ \tt a_j$ sont des entiers et b est un réel plus grand que 1, soit,
- $ \tt [a_0,a_1...a_p],[a_r,..a_p]$ avec $ \tt r\leq p < n$
où les $ \tt a_j$ sont des entiers, la première liste est le développement en fraction continue d'ordre p de alpha et la deuxième liste représente la période de cedéveloppement en fraction continue (les $ \tt a_j$ sont des entiers et donc alpha est un nombre quadratique)
.
On remarquera dans le programme ci-dessous que :
$ \tt a_0=floor(alpha)=q$ remplace $ \tt q:=iquo(a,b)$ lorsque alpha=a/b
et que r=alpha-q remplace $ \tt irem(a,b)/b$ lorsque alpha=a/b
et donc que si r=alpha-q, $ \tt a_1=floor(1/r)$ etc...
Le problème ici est de pouvoir comparer alpha et q c'est à dire savoir si r==0 et pour cela on est obligé de faire les calculs avec beaucoup de décimales c'est à dire d'augmenter le nombre de digits (on tape par exemple DIGITS:=30). Il faut bien sûr repérer la période, pour cela on forme la liste lr des restes successifs. La liste lq des parties entières successives forme le début du développement en fraction continue.
r2dfc(alpha,n):={
local r,q,lq,lr,p,j;
q:=floor(alpha);
r:=normal(alpha-q);
lq:=[];
lr:=[];
for (j:=1;j<=n;j:=j+1) {
lq:=concat(lq,q);
if (r==0){return (lq,[]);}
p:=member(r,lr);
if (p) {return (lq,mid(lq,p)):}
lr:=concat(lr,r);
alpha:=normal(1/r);
q:=floor(alpha);
r:=normal(alpha-q);
}
return (concat(lq,alpha),[]);
};
On tape :
dfc2r(sqrt(2),1)
On obtient :
([1,sqrt(2)+1],[])
On tape :
dfc2r(sqrt(2),2)
On obtient :
([1,2],[2])
On tape :
dfc2r(pi),6
On obtient :
([3,7,15,1,292,1,(-33102*pi+103993)/(33215*pi-104348)],[]) Remarque Le premier argument de doit être un nombre exact, car sinon les calculs sont faits en mode approché et le test r==0 n'est jamais réalisé...
next up previous contents index
suivant: La fonction dfc2r monter: Les programmes précédent: Les programmes   Table des matières   Index
Documentation de giac écrite par Renée De Graeve