problema forse conosciuto

Vuoi proporre i tuoi esercizi? Qui puoi farlo!!

Moderatore: tutor

Bloccato
Azarus
Messaggi: 580
Iscritto il: 01 gen 1970, 01:00
Località: Pisa

Messaggio da Azarus »

determinare le prime 100 cifre decimali di
<BR>
<BR>
<BR> ( sqrt(50) + 7 )^100
jack202
Messaggi: 231
Iscritto il: 01 gen 1970, 01:00
Località: Chieti
Contatta:

Messaggio da jack202 »

<html>
<BR><pre>
<BR>
<BR>Affronto la tua questione come un problema
<BR>di informatica, pur sapendo che questo è
<BR>assai poco \"matematico\"...
<BR>
<BR>
<BR>
<BR>Notiamo che, per n abbastanza grandi, il numero
<BR>(7+sqrt(50))^n è estremamente vicino al NUMERO INTERO
<BR>
<BR>(7+sqrt(50))^n + (7-sqrt(50))^n
<BR>
<BR>ma la formula appena scritta non è nient\'altro che
<BR>una ricorsione sciolta... la ricorsione è esattamente
<BR>
<BR>a[0]=2
<BR>a[1]=14
<BR>a[n+1] = 14a[n] + a[n-1]
<BR>
<BR>la parte intera di (7+sqrt(50))^100 sarà dunque a[100]-1...
<BR>il problema è ora quello di calcolare a[100] : per aggirare
<BR>i vincoli numerici del pascal (anche utilizzando il tipo
<BR>longint non andiamo oltre 2^31 , 10 cifre, mentre a noi servono
<BR>trunc(100log(7+sqrt(50))+1) = la bellezza di 115 cifre) dobbiamo
<BR>usufruire del tipo stringa come di un intero a 120 byte, reinventando
<BR>l\'algoritmo di somma e di moltiplicazione per 14. Fatto questo basta
<BR>reiterare la ricorsione fino ad a[100]. Ecco il listato :
<BR>
<BR>uses crt;
<BR>var x,y,z : string[120];
<BR>d,e : integer;
<BR>
<BR>
<BR>function quad(a:string):string;
<BR>var b,e:string;c,d,f,rip,code:integer;
<BR>begin
<BR>rip:=0;
<BR>b:=\'\';
<BR>for c := 1 to 120 do b:=b+\'0\';
<BR>for c := 120 downto 1 do begin
<BR> val(a[c],d,code);
<BR> f:=(14*d+rip) DIV 10;
<BR> d:=(14*d+rip) MOD 10;
<BR> rip:=f;
<BR> str(d,e);
<BR> b[c]:=e[1];
<BR> end;
<BR>quad:=b;
<BR>end;
<BR>
<BR>function sumup(a,h:string):string;
<BR>var b,e:string;c,d,f,g,rip,code:integer;
<BR>begin
<BR>rip:=0;
<BR>b:=\'\';
<BR>for c := 1 to 120 do b:=b+\'0\';
<BR>for c := 120 downto 1 do begin
<BR> val(a[c],d,code);val(h[c],g,code);
<BR> f:=(d+g+rip) DIV 10;
<BR> d:=(d+g+rip) MOD 10;
<BR> rip:=f;
<BR> str(d,e);
<BR> b[c]:=e[1];
<BR> end;
<BR>sumup:=b;
<BR>end;
<BR>
<BR>
<BR>begin
<BR>clrscr;
<BR>x:=\'\';y:=\'\';z:=\'\';
<BR>for d:=1 to 120 do begin x:=x+\'0\'; y:=y+\'0\'; z:=z+\'0\'; end;
<BR>x[120]:=\'2\';y[119]:=\'1\';y[120]:=\'4\';
<BR>
<BR>for e:= 1 to 99 do begin
<BR>z:=sumup(quad(y),x);
<BR>x:=y;
<BR>y:=z;
<BR>end;
<BR>writeln(z);
<BR>
<BR>readln;
<BR>end.
<BR>
<BR>
<BR>
<BR>Il numero che il listato va a stampare è proprio a[100].
<BR>Eccolo in tutto il suo splendore di 115 cifre :
<BR>
<BR>
<BR>6803080365529897483660812728120484942442484344868354562245623433426280769884783988939061560008012806483092824500002
<BR>
<BR>jack202
<BR>
<BR></pre>
<BR></html>
<BR>
<BR>
Azarus
Messaggi: 580
Iscritto il: 01 gen 1970, 01:00
Località: Pisa

Messaggio da Azarus »

da quello che so la cifra dovrebbe essere solo 9....
Azarus
Messaggi: 580
Iscritto il: 01 gen 1970, 01:00
Località: Pisa

Messaggio da Azarus »

ma io dicevo dopo la virgola comunque....
jack202
Messaggi: 231
Iscritto il: 01 gen 1970, 01:00
Località: Chieti
Contatta:

Messaggio da jack202 »

cazzo, potevi essere un attimo più chiaro !
<BR>vabè,
<BR>
<BR> (7+sqrt(50))^100 = a[100] - (7-sqrt(50)^100
<BR>
<BR>poichè (sqrt(50)-7)^100 è nell\'ordine di
<BR>
<BR>10^-115
<BR>
<BR>le prime 100 cifre decimali del nostro
<BR>numero saranno chiaramente tutti 9...
<BR>
<BR>
Azarus
Messaggi: 580
Iscritto il: 01 gen 1970, 01:00
Località: Pisa

Messaggio da Azarus »

scus...
Bloccato