제곱근의 연속 분율 결정


13

연분 수 다수의는 n다음과 같은 형태의 일부이다


되는 수렴 n.

a연속 분수 의 순서 는 일반적으로 다음과 같이 쓰여집니다. [a 0 ; a 1 , a 2 , a 3 , ... a n ].
우리는 같은 방식으로 작성하지만 세미콜론 사이에 반복되는 부분을 사용합니다.

목표는의 제곱근의 계속 된 부분을 반환하는 것입니다 n.
입력 : 정수, n. n완벽한 광장이 될 수 없습니다.
출력 : 의 계속 된 부분 sqrt(n).

테스트 사례 :
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

가장 짧은 코드가 승리합니다. 행운을 빕니다!


1
출력은 테스트 사례와 동일한 형식이어야합니까?
grc

아니요. 세미콜론이 있으면 괜찮습니다.
beary605

흠, 정답을 얻었을 때 분수가 멈출 합리적 시간을 알지 못하는 데 어려움을 겪었습니다. <sub> 0 </ sub>이 원래 입력의 sqrt의 두 배일 때처럼 간단합니까?
JoeFish 2016 년

네, 그것이 한계입니다.
beary605

@ beary605 감사합니다. 더 많은 독서를 해왔고 이제는 제곱근의 계속되는 부분이 특별한 경우라는 것을 알았습니다. 매혹적인 물건! 부동 소수점 버전에서 여전히 작업 중입니다.
JoeFish 2016 년

답변:


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스택 을 차지하고 스택에 남겨 두는 단일 연산자를 원한다는 것을 알았습니다 a/b a%b.


1
나는 정말로 GS를 배워야한다고 말하고 싶습니다. 그러나 필요 는 여기에 너무나 강한 단어입니다;)
boothby

1
@boothby, 미쳐하지 마십시오. 당신의 인생은 GS 없이는 완성되지 않을 것입니다;)
Peter Taylor

3

파이썬, 95 97 (그러나 맞습니다 ...)

이것은 정수 산술 및 바닥 나누기 만 사용합니다. 이것은 모든 양의 정수 입력에 대해 올바른 결과를 생성하지만, 긴 것을 사용하려면 문자를 추가해야합니다. 예를 들어 m=a=0L. 그리고 물론 ... 가난한 사람의 바닥 sqrt가 끝나기를 백만 년 동안 기다립니다.

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)

편집 : 이제 Peter Taylor의 알고리즘을 사용합니다. 그것은 do...while재미 있었다.


의 목적은 *(c*c-n)무엇입니까?
피터 테일러

@ PeterTaylor, 나는 충분히 도전을 읽지 않았고 완벽한 사각형을 위해 코드를 작동시켰다.
boothby 2016 년

2

파이썬, 87 82 80

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

하나의 정수를 취하고 다음과 같은 출력을 제공합니다.

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

x-int(x) -> x%1. 감동합니다 :)
beary605


√139에서 작동하도록 업데이트했습니다. 그러나 시퀀스의 길이가 훨씬 길어지면 (√139의 시퀀스는 18 개의 숫자 임) 결과의 정확도가 떨어지기 시작합니다.
grc

나는 항상 2 * INT (sqrt (a))로 끝나는 것이 매우 흥미 롭습니다.
beary605

더 흥미로운 것은 이제 우리 중 3 명이 139 코드를 깨뜨렸다는 것입니다 (광산은 여전히 ​​골퍼되지 않고 게시되지 않았습니다).
JoeFish 2016 년

2

매스 매 티카 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@#&
Dr. belisarius

여기서 정확히 무엇을 세고 있습니까? 이것은 stdin에서 입력을받는 프로그램입니까? 사용 방법은 함수 정의가없는 함수 본문처럼 보입니다.
피터 테일러

@ 피터 테일러 수정 사항을 참조하십시오.
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 루프에 한 줄로 넣을 수 있습니다.
grc

스크립트를 실행하면 8 ;1;74와 75 가 출력됩니다 . 그건 옳지 않은 것 같습니다. 그것은 76에 매달린다.
breadbox

^^ 예. 내 코드를 수정했습니다.
beary605

이 버전은 139의 잘못된 결과를 제공합니다.
breadbox

@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

펄, 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 

따라서 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

인수가 숫자의 제곱 인 경우 하나의 요소로 구성된 하나의 목록, 해당 숫자의 sqrt를 반환합니다.

  f 4
2 

그것이 "codegolf"가없는 한 연습에서 나에게 의존한다면 sqrti () 함수를 사용하는 이전 편집을 선호합니다 ...


1
반드시 fq및 대신 단일 문자 이름을 사용할 수 있습니다 a0. 또한 : (a×Q)-P->P-⍨a×Q
ngn

Q←Q÷⍨-나르는 지원 Q÷⍨←합니까?
ngn

@ngn : 내가 사용하고 싶지 않다 "Q ÷ ⍨ ←"다중 할당 식의 사슬에서 ... 대한 남아 동의 ... 가능한 내가 말하는 것을 나는 C 정의되지 않은 동작 보았 기 때문에
RosLuP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.