Menentukan fraksi lanjutan dari akar kuadrat

13

The kelangsungan pecahan dari angka nadalah sebagian kecil dari bentuk berikut:


yang konvergen ke n.

Urutan adalam fraksi lanjutan biasanya ditulis sebagai: [a 0 ; a 1 , a 2 , a 3 , ... a n ].
Kita akan menulis milik kita dengan cara yang sama, tetapi dengan bagian berulang antara titik koma.

Tujuan Anda adalah mengembalikan fraksi lanjutan dari akar kuadrat dari n.
Input: Bilangan bulat n,. ntidak akan pernah menjadi kotak yang sempurna.
Output: Fraksi lanjutan dari sqrt(n).

Kasus uji:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

Kode terpendek menang. Semoga berhasil!

beary605
sumber
1
Apakah output harus dalam format yang sama dengan test case?
grc
Tidak. Selama Anda memiliki titik koma, tidak apa-apa.
beary605
Hm, mendapatkan jawaban yang benar, kesulitan mengetahui kapan pecahannya rasional untuk dihentikan. Apakah benar-benar sesederhana ketika <sub> 0 </sub> gandakan sqrt dari input asli?
JoeFish
Yap, itu batasnya.
beary605
@ beary605 terima kasih. Telah melakukan lebih banyak membaca, dan sekarang saya melihat bahwa fraksi lanjutan dari akar kuadrat adalah sedikit kasus khusus. Hal yang menarik! Masih bekerja pada versi titik non-mengambang.
JoeFish

Jawaban:

3

GolfScript ( 66 60 karakter)

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

Peringatan: sebagian besar ?di sana adalah variabel yang mewakili floor(sqrt(input))daripada builtin. Tapi yang pertama adalah builtin.

Membawa input pada stdin dan output ke stdout.

Psuedocode dari algoritma (bukti kebenaran saat ini dibiarkan sebagai latihan untuk pembaca):

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)

Sekali lagi saya menemukan diri saya menginginkan satu operator yang mengambil a btumpukan dan meninggalkan a/b a%btumpukan.

Peter Taylor
sumber
1
Saya akan mengatakan bahwa saya benar-benar perlu belajar GS ... tapi perlu kata yang terlalu kuat di sini;)
boothby
1
@ bby, jangan gila. Hidup Anda tidak akan lengkap tanpa GS;)
Peter Taylor
3

Python, 95 97 (tapi benar ...)

Ini hanya menggunakan bilangan bulat aritmatika dan pembagian lantai. Ini akan menghasilkan hasil yang benar untuk semua input bilangan bulat positif, meskipun jika seseorang ingin menggunakan panjang, mereka harus menambahkan karakter; misalnya m=a=0L. Dan tentu saja ... tunggu sejuta tahun sampai lantai orang miskin saya akan berakhir.

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

Keluaran:

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

sunting: sekarang menggunakan algoritma Peter Taylor. Itu do...whilemenyenangkan.

stan
sumber
Apa tujuannya *(c*c-n)?
Peter Taylor
@ PeterTaylor, saya belum cukup membaca tantangan, dan membuat kode berfungsi untuk kuadrat sempurna.
Stanby
2

Python, 87 82 80 80

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

Dibutuhkan satu integer dan memberikan output seperti:

4; 2, 1, 3, 1, 2, 8;
grc
sumber
x-int(x) -> x%1. Saya terkesan :)
beary605
Memberikan hasil yang salah untuk √139 menurut Wolfram Alpha
breadbox
Saya telah memperbaruinya untuk √139. Namun, jika panjang urutan menjadi lebih lama (√139 memiliki urutan 18 angka), maka hasilnya mungkin akan mulai kehilangan keakuratan.
grc
Saya merasa sangat menarik bahwa selalu berakhir dengan 2 * int (sqrt (a)).
beary605
Lebih menarik lagi sekarang 3 dari kita memiliki kode rusak untuk 139 (milik saya masih tidak golf dan belum diposkan).
JoeFish
2

Mathematica 33 31

c[n_]:=ContinuedFraction@Sqrt@n

Output dalam format daftar, yang lebih sesuai untuk Mathematica. Contoh:

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
sumber
1
Ya ampun, aku benar-benar mengharapkan jawaban ini. Saya tidak akan menganggapnya sebagai jawaban yang sebenarnya, kecuali jika Anda menghasilkan fraksi lanjutan sendiri.
beary605
@ beary605 Cukup adil.
DavidC
2
+1 Lebih baik lagi (25 karakter)ContinuedFraction@Sqrt@#&
Dr. belisarius
Apa yang sebenarnya Anda hitung di sini? Apakah ini program yang mengambil input dari stdin? Karena cara Anda menggunakannya sepertinya itu adalah fungsi tubuh tanpa definisi fungsi.
Peter Taylor
@ Peter Taylor Silakan lihat amandemennya.
DavidC
1

Python ( 136 133) 96)

Metode standar untuk fraksi lanjutan, sangat 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]
beary605
sumber
Anda dapat menyimpan beberapa karakter dengan menggunakan while 1:. Anda juga bisa meletakkan sebagian besar pernyataan di loop sementara pada satu baris.
grc
Ketika saya menjalankan skrip Anda, saya mendapatkan output 8 ;1;untuk 74 dan 75; itu sepertinya tidak benar.
Menggantung
^^ Yap. Memperbaiki kode saya.
beary605
Versi ini memberikan hasil yang salah untuk 139.
kotak roti
@ boothby Kemudian saya akan menghapus milik saya dan kami akan menyebutnya seri :)
JoeFish
1

C, 137

Termasuk baris baru, dengan asumsi saya tidak harus memutar akar kuadrat saya sendiri.

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

Istirahat untuk sqrt (139) dan mengandung titik koma ekstra sesekali dalam output, tapi aku terlalu lelah untuk bekerja lebih jauh malam ini :)

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

Perl, 99 karakter

Apakah tidak mengacaukan atas 139, 151, dll Diuji dengan nomor dari 1 sampai 9 digit.

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

Catatan: $%,, $=dan $-semuanya adalah variabel pemaksaan integer.

kotak roti
sumber
1

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

Fungsi f didasarkan pada algo yang ditemukan di halaman http://mathworld.wolfram.com/PellEquation.html untuk menyelesaikan persamaan Pell. Fungsi f itu input semua bukan angka negatif (ketik fraksi juga). Mungkin ada sesuatu yang salah, saya ingat bahwa √ memiliki, dalam cara saya melihatnya, masalah untuk bilangan pecahan besar, seperti

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

jadi akan ada satu fungsi sqrti (). Untuk alasan ini, fraksi input (dan input integer) harus <10 ^ 15. uji:

 ⎕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

jika argumen adalah kuadrat dari angka itu akan mengembalikan satu daftar 1 elemen saja, sqrt dari angka itu

  f 4
2 

Jika itu akan tergantung dari saya, dalam satu latihan tanpa "codegolf" saya akan lebih suka mengedit sebelumnya yang menggunakan fungsi sqrti () ...

RosLuP
sumber
1
tentunya Anda dapat menggunakan nama satu huruf, bukan fqdan a0. juga: (a×Q)-P->P-⍨a×Q
ngn
Q←Q÷⍨- apakah nars mendukung Q÷⍨←?
ngn
@ ngn: Saya tidak suka menggunakan "Q ÷ ⍨ ←" dalam rangkaian rumus penugasan ganda ... untuk yang lainnya tetap setuju ... Mungkin saya mengatakan itu karena saya melihat C Undefined Behavior
RosLuP