Determinare le frazioni continue di radici quadrate


13

La frazione continua di un numero nè una frazione della seguente forma: a


cui converge n.

La sequenza ain una frazione continua è tipicamente scritta come: [a 0 ; a 1 , a 2 , a 3 , ... a n ].
Scriveremo i nostri nello stesso modo, ma con la parte ripetuta tra punti e virgola.

Il tuo obiettivo è di restituire la frazione continua della radice quadrata di n.
Ingresso: Un numero intero, n. nnon sarà mai un quadrato perfetto.
Output: la frazione continua di sqrt(n).

Casi test:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

Il codice più corto vince. In bocca al lupo!


1
L'output deve essere nello stesso formato dei casi di test?
grc,

No. Finché hai il punto e virgola, va bene.
beary605

Hm, ottenere le risposte giuste, avere difficoltà a sapere quando la frazione è razionale da fermare. È davvero semplice come quando <sub> 0 </sub> è il doppio dello sqrt dell'input originale?
JoeFish,

Sì, questo è il limite.
beary605,

@ beary605 grazie. Ho letto molte più letture, e ora vedo che la frazione continua di una radice quadrata è un po 'un caso speciale. Roba affascinante! Funziona ancora su una versione in virgola mobile.
Joe Fish

Risposte:


3

GolfScript ( 66 60 caratteri)

~:^,{.*^>}?(:?';'[1?{^1$.*-@/?@+.2$/@@1$%?\- 1$(}do;;]','*1$

Avvertenza: la maggior parte di ?in ci sono la variabile che rappresenta floor(sqrt(input))anziché l'integrato. Ma il primo è incorporato.

Porta input su stdin e output su stdout.

Psuedocode dell'algoritmo (prova di correttezza attualmente lasciata come esercizio per il lettore):

n := input()
m := floor(sqrt(n))
output(m)
x := 1
y := m
do
  x := (n - y * y) / x
  output((m + y) / x)
  y := m - (m + y) % x
while (x > 1)

Ancora una volta mi ritrovo a desiderare un singolo operatore che prende a bla pila e lascia a/b a%bla pila.


1
Direi che ho davvero bisogno di imparare GS ... ma necessità è una parola un po 'troppo forte qui;)
Boothby

1
@boothby, non essere pazzo. La tua vita non sarà completa senza GS;)
Peter Taylor,

3

Python, 95 97 (ma corretto ...)

Questo utilizza solo l'aritmetica intera e la divisione del pavimento. Ciò produrrà risultati corretti per tutti gli input di numeri interi positivi, anche se se si desidera utilizzare un valore lungo, è necessario aggiungere un carattere; per esempio m=a=0L. E ovviamente ... aspetto un milione di anni perché il piano del mio povero uomo finisca.

z=x=m=1
while n>m*m:m+=1
m=y=m-1
l=()
while-z<x:x=(n-y*y)/x;y+=m;l+=y/x,;y=m-y%x;z=-1
print c,l

Produzione:

n=139
11 (1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22)

modifica: ora usando l'algoritmo di Peter Taylor. È do...whilestato divertente.


Qual è lo scopo di *(c*c-n)?
Peter Taylor,

@PeterTaylor, non avevo letto la sfida abbastanza attentamente e ho fatto funzionare il codice per quadrati perfetti.
stand dal

2

Python, 87 82 80

x=r=input()**.5
while x<=r:print"%d"%x+",;"[x==r],;x=1/(x%1)
print`int(r)*2`+";"

Prende un numero intero e fornisce un output come:

4; 2, 1, 3, 1, 2, 8;

x-int(x) -> x%1. Sono impressionato :)
beary605

Fornisce il risultato sbagliato per √139 secondo Wolfram Alpha
breadbox il

L'ho aggiornato per funzionare con √139. Tuttavia, se la lunghezza della sequenza diventa molto più lunga (√139 ha una sequenza di 18 numeri), probabilmente il risultato inizierà a perdere precisione.
grc

Trovo incredibilmente interessante che finisca sempre in 2 * int (sqrt (a)).
beary605

Ulteriore interessante è che ora 3 di noi hanno un codice non funzionante per 139 (il mio è ancora non golfato e non pubblicato).
JoeFish,

2

Mathematica 33 31

c[n_]:=ContinuedFraction@Sqrt@n

L'output è in formato elenco, che è più appropriato per Mathematica. Esempi:

c[2]
c[3]
c[19]
c[139]
c[1999]

(* out *)
{1, {2}}
{1, {1, 2}}
{4, {2, 1, 3, 1, 2, 8}}
{11, {1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22}}
{44, {1, 2, 2, 4, 1, 1, 5, 1, 5, 8, 1, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 
  1, 14, 3, 1, 1, 29, 4, 4, 2, 5, 1, 1, 17, 2, 1, 12, 9, 1, 5, 1, 43, 
  1, 5, 1, 9, 12, 1, 2, 17, 1, 1, 5, 2, 4, 4, 29, 1, 1, 3, 14, 1, 1, 
  1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 8, 5, 1, 5, 1, 1, 4, 2, 2, 1, 88}}

1
Oh amico, mi aspettavo totalmente questa risposta. Non la considero una risposta effettiva, a meno che tu non generi tu stesso la frazione continua.
beary605

@ beary605 Abbastanza giusto.
DavidC,

2
+1 Meglio ancora (25 caratteri)ContinuedFraction@Sqrt@#&
Dr. belisarius,

Cosa stai contando esattamente qui? È un programma che riceve input da stdin? Perché il modo in cui lo usi sembra un corpo di funzione senza la definizione di funzione.
Peter Taylor,

@Peter Taylor Si prega di consultare l'emendamento.
DavidC,

1

Python ( 136 133 96)

Il metodo standard per le frazioni continue, estremamente golf.

a=input()**.5
D=c=int(a);b=[]
while c!=D*2:a=1/(a%1);c=int(a);b+=[c]
print D,";%s;"%str(b)[1:-1]

Puoi salvare alcuni caratteri usando while 1:. Puoi anche mettere la maggior parte delle istruzioni nel ciclo while su una sola riga.
grc,

Quando eseguo il tuo script, ottengo un output di 8 ;1;74 e 75; non sembra giusto. Pende 76.
breadbox

^^ Sì. Risolto il mio codice
beary605

Questa versione fornisce un risultato errato per 139.
breadbox,

@boothby Poi eliminerò il mio e lo chiameremo sorteggio :)
JoeFish,

1

C, 137

Compresa la newline, supponendo che non debba rotolare la mia radice quadrata.

#include<math.h>
main(i,e){double d;scanf("%lf",&d);e=i=d=sqrt(d);while(i^e*2)printf("%d%c",i,e^i?44:59),i=d=1.0/(d-i);printf("%d;",i);}

Si rompe per sqrt (139) e contiene il punto e virgola extra occasionale nell'output, ma sono troppo stanco per lavorarci ulteriormente stasera :)

5
2; 4;
19
4; 2,1,3,1,2,8;
111
10; 1,1,6,1,1,20;

1

Perl, 99 caratteri

Non non rovinare il 139, 151, ecc Testato con il numero che va da 1 a 9 cifre.

$"=",";$%=1;$==$-=($n=<>)**.5;
push@f,$==(($s=$=*$%-$s)+$-)/($%=($n-$s*$s)/$%)until$=>$-;
say"$-;@f;"

Nota: $%, $=, e $-sono tutte variabili intere-forzatura.


1

APL (NARS), 111 caratteri, 222 byte

r←f w;A;a;P;Q;m
m←⎕ct⋄Q←1⋄⎕ct←P←0⋄r←,a←A←⌊√w⋄→Z×⍳w=0
L: →Z×⍳0=Q←Q÷⍨w-P×P←P-⍨a×Q⋄r←r,a←⌊Q÷⍨A+P⋄→L×⍳Q>1
Z: ⎕ct←m

La funzione f si basa sull'algo che trovi nella pagina http://mathworld.wolfram.com/PellEquation.html per risolvere l'equazione di Pell. Quella funzione f ha il suo input tutto il numero non negativo (digitare anche la frazione). Possibile che qualcosa vada storto, ricordo che √ ha, a mio modo di vedere, un problema per i numeri di grandi frazioni, come

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

quindi ci sarebbe una funzione sqrti (). Per questo motivo l'input della frazione (e l'input intero) deve essere <10 ^ 15. test:

 ⎕fmt (0..8),¨⊂¨f¨0..8
┌9───────────────────────────────────────────────────────────────────────────────────────────────────────┐
│┌2─────┐ ┌2─────┐ ┌2───────┐ ┌2─────────┐ ┌2─────┐ ┌2───────┐ ┌2─────────┐ ┌2─────────────┐ ┌2─────────┐│
││  ┌1─┐│ │  ┌1─┐│ │  ┌2───┐│ │  ┌3─────┐│ │  ┌1─┐│ │  ┌2───┐│ │  ┌3─────┐│ │  ┌5─────────┐│ │  ┌3─────┐││
││0 │ 0││ │1 │ 1││ │2 │ 1 2││ │3 │ 1 1 2││ │4 │ 2││ │5 │ 2 4││ │6 │ 2 2 4││ │7 │ 2 1 1 1 4││ │8 │ 2 1 4│││
││~ └~─┘2 │~ └~─┘2 │~ └~───┘2 │~ └~─────┘2 │~ └~─┘2 │~ └~───┘2 │~ └~─────┘2 │~ └~─────────┘2 │~ └~─────┘2│
│└∊─────┘ └∊─────┘ └∊───────┘ └∊─────────┘ └∊─────┘ └∊───────┘ └∊─────────┘ └∊─────────────┘ └∊─────────┘3
└∊───────────────────────────────────────────────────────────────────────────────────────────────────────┘
  f 19
4 2 1 3 1 2 8 
  f 54321x
233 14 1 1 3 2 1 2 1 1 1 1 3 4 6 6 1 1 2 7 1 13 4 11 8 11 4 13 1 7 2 1 1 6 6 4 3 1 1 1 1 2 1 2 3 1 1 14 466 
  f 139
11 1 3 1 3 7 1 1 2 11 2 1 1 7 3 1 3 1 22 
  +∘÷/f 139
11.78982612
  √139
11.78982612

se l'argomento è un quadrato di un numero restituirebbe un elenco di 1 solo elemento, il sqrt di quel numero

  f 4
2 

Se dipendesse da me, in un esercizio senza "codegolf" preferirei la modifica precedente che utilizzava la funzione sqrti () ...


1
sicuramente puoi usare nomi di una sola lettera invece di fqe a0. anche: (a×Q)-P->P-⍨a×Q
ngn,

Q←Q÷⍨ - supporta nars Q÷⍨← ?
ngn,

@ngn: Non mi piace usare "Q ÷ ⍨ ←" in una catena di formula di assegnazione multipla ... per rimanere d'accordo ... Possibile che lo dica perché ho visto C Undefined Behaviour
RosLuP
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.