平方根の連続分数の決定


13

連分数数はn、次の形式の割合である


に収束しますn

連続aした分数のシーケンスは、通常次のように記述されます。[a 0 ; a 1、a 2、a 3、... a n ]。
同じように書きますが、セミコロンの間に部分を繰り返します。

あなたの目標は、の平方根の継続部分を返すことですn
入力:整数nn完全な正方形になることはありません。
出力:の継続分数sqrt(n)

テストケース:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

最短のコードが優先されます。幸運を!


1
出力はテストケースと同じ形式である必要がありますか?
-grc

いいえ。セミコロンがあれば大丈夫です。
beary605

ええと、正しい答えを得て、分数がいつ停止するのが合理的であるかを知るのに苦労しています。a <sub> 0 </ sub>が元の入力のsqrtの2倍のときと同じくらい簡単ですか?
JoeFish

はい、それが限界です。
beary605

@ beary605ありがとう。より多くの読書をしている、そして今私は平方根の継続的な割合が少し特別なケースであることがわかります。魅力的なもの!まだ非浮動小数点バージョンで作業中です。
JoeFish

回答:


3

GolfScript(66 60文字)

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

警告:?そこにはほとんどがfloor(sqrt(input))組み込みではなく変数を表します。しかし、最初のものは組み込みです。

stdinで入力を受け取り、stdoutに出力します。

アルゴリズムの疑似コード(読者の演習として現在残っている正確性の証明):

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)

繰り返しになりますa bが、スタックを引き受けてスタックを離れる1人のオペレーターを望んa/b a%bでいます。


1
私は本当にGSを学ぶ必要があると言います...しかし、ここでは少し強すぎる言葉が必要です;)
ブースビー

1
@boothby、狂わないで。あなたの人生はGSなしでは完了しません;)
ピーターテイラー

3

Python、95 97(ただし正しい...)

これは、整数演算とフロア除算のみを使用します。これにより、すべての正の整数入力に対して正しい結果が生成されますが、longを使用する場合は文字を追加する必要があります。例えばm=a=0L。そしてもちろん...私の貧しい男性の床面積が終了するまで100万年待ちます。

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

出力:

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

編集:現在、ピーターテイラーのアルゴリズムを使用しています。それはdo...while楽しかったです。


の目的は*(c*c-n)何ですか?
ピーターテイラー

@PeterTaylor、私は課題を十分に注意深く読んでいなかったので、コードを完全な正方形で動作させました。
ブースビー

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`+";"

1つの整数を受け取り、次のような出力を提供します。

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

x-int(x) -> x%1。私は感銘を受けました:)
beary605


√139で動作するように更新しました。ただし、シーケンスの長さがはるかに長くなると(√139には18個の数字のシーケンスがあります)、結果はおそらく精度を失い始めます。
-grc

常に2 * int(sqrt(a))で終わることが非常に興味深いと思います。
beary605

さらに興味深いのは、139人分のコードが壊れている3人であることです(私のものはまだゴルフも投稿もされていません)。
-JoeFish

2

Mathematica 33 31

c[n_]:=ContinuedFraction@Sqrt@n

出力はリスト形式であり、Mathematicaにより適しています。例:

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
ああ、私は完全にこの答えを期待していました。継続的な割合を自分で生成しない限り、実際の答えとは見なしません。
beary605

@ beary605まあまあ。
DavidC

2
+1はまだ良い(25文字)ContinuedFraction@Sqrt@#&
ベリサリウス博士

ここで正確に何を数えていますか?これは標準入力から入力を受け取るプログラムですか?使用方法は、関数定義のない関数本体のように見えるためです。
ピーターテイラー

@ピーターテイラー改正をご覧ください。
DavidC

1

パイソン(136133 96)

継続的な分数の標準的な方法で、非常にゴルフに適しています。

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]

を使用して、いくつかの文字を保存できますwhile 1:。また、whileループ内のほとんどのステートメントを1行に配置することもできます。
-grc

スクリプトを実行すると8 ;1;、74および75の出力が得られます。それは正しくないようです。76でハングします
。-ブレッドボックス

^^はい。私のコードを修正しました。
beary605

このバージョンでは139の結果が間違っています
。-ブレッドボックス

@boothbyその後、私は私のものを削除し、それをドローと呼びます:)
JoeFish

1

C、137

改行を含めて、自分の平方根をロールする必要がないと仮定します。

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

それはsqrt(139)のために壊れており、出力に時折余分なセミコロンが含まれていますが、今夜さらに作業するには疲れすぎています:)

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

1

Perl、99文字

139、151などで問題が発生することはありません。1〜9桁の数値でテスト済みです。

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

注意:$%$=、および$-すべての整数強制変数です。


1

APL(NARS)、111文字、222バイト

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

f関数は、 Pell方程式を解くためのページhttp://mathworld.wolfram.com/PellEquation.htmlにあるアルゴリズムに基づいています。このf関数の入力はすべて負の数ではありません(型の分数も)。何かが間違っている可能性があります、私は√が、私の見方では、大きな小数の問題を抱えていることを覚えています

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

したがって、1つの関数sqrti()があります。このため、小数入力(および整数入力)は<10 ^ 15でなければなりません。テスト:

 ⎕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

引数が数値の2乗の場合、1つの要素のみのリスト、その数値のsqrtを返します

  f 4
2 

私に依存する場合は、「codegolf」を使用しない1つの演習で、関数sqrti()を使用する以前の編集を優先します。


1
確実にfqとの代わりに1文字の名前を使用できますa0。また:(a×Q)-P->P-⍨a×Q
ngn

Q←Q÷⍨-narsはサポートしていQ÷⍨←ますか?
NGN

@ngn:私は使用ことが好きではありません「Q÷⍨←」複数の代入式のチェーンで...のために残って同意する...可能性のある私は言う私はC未定義の動作見たので
RosLuP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.