Bestimmen der fortgesetzten Bruchteile von Quadratwurzeln

13

Der fortgesetzte Bruch einer Zahl nist ein Bruch der folgenden Form:


die konvergiert zu n.

Die Sequenz ain einem fortgesetzten Bruch wird typischerweise wie folgt geschrieben: [a 0 ; a 1 , a 2 , a 3 , ... a n ].
Wir werden unsere auf die gleiche Weise schreiben, aber mit dem sich wiederholenden Teil zwischen Semikolons.

Ihr Ziel ist es, den fortgesetzten Bruchteil der Quadratwurzel von zurückzugeben n.
Input: eine ganze Zahl ist n. nwird niemals ein perfektes Quadrat sein.
Ausgabe: Der fortgesetzte Bruchteil von sqrt(n).

Testfälle:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

Kürzester Code gewinnt. Viel Glück!

beary605
quelle
1
Muss die Ausgabe im selben Format wie die Testfälle vorliegen?
Grc
Nein, solange Sie die Semikolons haben, ist es in Ordnung.
beary605,
Hm, die richtigen Antworten zu bekommen, Probleme zu wissen, wann der Bruch vernünftig zu stoppen ist. Ist es wirklich so einfach, wie wenn eine <sub> 0 </ sub> doppelt so groß ist wie die ursprüngliche Eingabe?
JoeFish
Ja, das ist die Grenze.
beary605
@ beary605 danke. Ich habe viel mehr gelesen und jetzt sehe ich, dass der fortgesetzte Bruchteil einer Quadratwurzel ein bisschen ein Sonderfall ist. Faszinierendes Zeug! Arbeitet immer noch an einer Nicht-Gleitkomma-Version.
JoeFish

Antworten:

3

GolfScript ( 66 60 Zeichen)

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

Warnung: Die meisten ?der Variablen stellen floor(sqrt(input))die eingebaute Variable dar und nicht die eingebaute. Aber der erste ist der eingebaute.

Übernimmt die Eingabe für stdin und die Ausgabe für stdout.

Pseudocode des Algorithmus (Korrektheitsnachweis, der dem Leser derzeit als Aufgabe überlassen wird):

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)

Wieder einmal möchte ich einen einzelnen Operator, der a bden Stapel übernimmt und a/b a%bauf dem Stapel verbleibt.

Peter Taylor
quelle
1
Ich würde sagen, dass ich GS wirklich lernen muss ... aber das Bedürfnis ist hier ein bisschen zu stark;)
Stand
1
@boothby, sei nicht verrückt. Ihr Leben wird ohne GS nicht vollständig sein;)
Peter Taylor
3

Python, 95 97 (aber richtig ...)

Dies verwendet nur Ganzzahlarithmetik und Bodenteilung. Dies führt zu korrekten Ergebnissen für alle positiven Ganzzahleingaben. Wenn Sie jedoch ein Long verwenden möchten, müssen Sie ein Zeichen hinzufügen. zum beispiel m=a=0L. Und natürlich ... warte eine Million Jahre, bis der Fußboden meines armen Mannes leer ist.

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

Ausgabe:

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

edit: jetzt mit Peter Taylors Algorithmus. Das hat do...whileSpaß gemacht.

boothby
quelle
Was ist der Zweck von *(c*c-n)?
Peter Taylor
@PeterTaylor, ich hatte die Herausforderung nicht sorgfältig genug gelesen und den Code für perfekte Quadrate funktionieren lassen.
Stand
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`+";"

Es benötigt eine ganze Zahl und gibt Folgendes aus:

4; 2, 1, 3, 1, 2, 8;
grc
quelle
x-int(x) -> x%1. Ich bin beeindruckt :)
beary605
Gibt das falsche Ergebnis für √139 nach Wolfram Alpha
breadbox
Ich habe es für √139 aktualisiert. Wenn jedoch die Länge der Sequenz viel länger wird (√139 hat eine Sequenz von 18 Zahlen), wird das Ergebnis wahrscheinlich an Genauigkeit verlieren.
Grc
Ich finde es unglaublich interessant, dass es immer mit 2 * int (sqrt (a)) endet.
beary605
Weiter interessant ist nun, dass 3 von uns den Code für 139 gebrochen haben (meiner ist noch nicht golfen und nicht gepostet).
JoeFish
2

Mathematica 33 31

c[n_]:=ContinuedFraction@Sqrt@n

Die Ausgabe erfolgt im Listenformat, das für Mathematica besser geeignet ist. Beispiele:

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}}
DavidC
quelle
1
Oh man, ich habe diese Antwort total erwartet. Ich werde es nicht als tatsächliche Antwort betrachten, es sei denn, Sie generieren den fortgesetzten Bruchteil selbst.
beary605
@ beary605 Fair genug.
DavidC
2
+1 Noch besser (25 Zeichen)ContinuedFraction@Sqrt@#&
Dr. Belisarius
Was genau zählen Sie hier? Ist das ein Programm, das Eingaben von stdin nimmt? Weil die Art und Weise, wie Sie es verwenden, so aussieht, als wäre es ein Funktionskörper ohne Funktionsdefinition.
Peter Taylor
@ Peter Taylor Bitte beachten Sie die Änderung.
DavidC
1

Python ( 136 133 96)

Die Standardmethode für fortgesetzte Fraktionen, extrem golfen.

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]
beary605
quelle
Sie können mit ein paar Zeichen sparen while 1:. Sie können auch die meisten Anweisungen in der while-Schleife in eine einzelne Zeile einfügen.
Grc
Wenn ich Ihr Skript ausführe, erhalte ich eine Ausgabe von 8 ;1;74 und 75; das scheint nicht richtig. Es hängt am 76.
Brotkasten
^^ Ja. Mein Code wurde repariert.
beary605
Diese Version gibt das falsche Ergebnis für 139.
Brotkasten
@boothby Dann werde ich meine löschen und wir nennen es ein Unentschieden :)
JoeFish
1

C 137

Einschließlich der Newline, vorausgesetzt, ich muss nicht meine eigene Quadratwurzel rollen.

#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);}

Es bricht für sqrt (139) und enthält das gelegentliche zusätzliche Semikolon in der Ausgabe, aber ich bin zu müde, um heute Abend weiter daran zu arbeiten :)

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

Perl, 99 Zeichen

Ist nicht Schraube bis auf 139, 151, etc. getestet mit Zahl im Bereich von 1 bis 9 Ziffern.

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

Hinweis: $%, $=, und $-sind alle ganzzahligen Variablen zwingen.

Brot-Box
quelle
1

APL (NARS), 111 Zeichen, 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

Die f-Funktion basiert auf dem Algorithmus, den Sie auf der Seite http://mathworld.wolfram.com/PellEquation.html zur Lösung der Pell-Gleichung finden. Die Eingabe dieser f-Funktion hat alle keine negative Zahl (auch Typbruch). Möglicherweise läuft da etwas schief, ich erinnere mich, dass √, wie ich es sehe, ein Problem für große Bruchzahlen hat, wie

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

es gäbe also eine Funktion sqrti (). Aus diesem Grund muss die Eingabe von Brüchen (und ganzen Zahlen) <10 ^ 15 sein. Prüfung:

 ⎕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

Wenn das Argument ein Quadrat einer Zahl ist, gibt es eine Liste mit nur einem Element zurück, den Quadrat dieser Zahl

  f 4
2 

Wenn es von mir abhängen würde, würde ich in einer Übung ohne "Codegolf" die vorherige Bearbeitung vorziehen, die die Funktion sqrti () verwendet ...

RosLuP
quelle
1
Sicherlich können Sie anstelle von fqund auch Namen mit einem Buchstaben verwenden a0. auch: (a×Q)-P->P-⍨a×Q
ngn
Q←Q÷⍨- Unterstützt NARS Q÷⍨←?
ngn
@ngn: Ich mag es nicht, "Q ÷ ⍨ ←" in einer Kette von Mehrfachzuweisungsformeln zu verwenden ... für das Verbleibende stimme zu ... Möglicherweise sage ich das, weil ich C
Undefined