Визначення тривалих дробів квадратних коренів


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

Так, це межа.
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на себе стек і залишає a/b a%bна стеку.


1
Я б сказав, що мені справді потрібно вивчити GS ... але тут потрібне трохи занадто сильне слово;)
кабінка

1
@boothby, не будь з розуму. Ваше життя не буде повним без GS;)
Пітер Тейлор

3

Python, 95 97 (але правильно ...)

Тут використовується лише ціла арифметика і ділення підлоги. Це дасть правильні результати для всіх позитивних цілих вхідних даних, хоча якщо хтось хоче використовувати довгий, їм доведеться додати символ; наприклад m=a=0L. І звичайно ... зачекайте мільйон років, коли мою бідну чоловічу квартиру завершиться.

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

Пітона, 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 за версією Wolfram Alpha
хлібопекар

Я оновив його для роботи на √139. Однак якщо довжина послідовності стає значно довшою (√139 має послідовність 18 чисел), то результат, ймовірно, почне втрачати точність.
grc

Мені здається неймовірно цікавим, що він завжди закінчується 2 * int (sqrt (a)).
beary605

Далі цікаво, зараз 3 з нас зламали код на 139 (шахта досі не гольфується та не розміщена).
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@#&
годин

Що саме ви тут рахуєте? Це програма, яка бере вклад з stdin? Тому що спосіб його використання виглядає як тіло функції без визначення функції.
Пітер Тейлор

@ Peter Taylor Будь ласка, дивіться поправку.
DavidC

1

Пітон ( 136 133 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.
хлібниця

^^ Так. Виправлено мій код.
beary605

Ця версія дає неправильний результат для 139.
хлібниця

@boothby Тоді я видалю шахту і назвемо це нічиєю :)
JoeFish

1

С, 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 заснована на знаходженні algo на сторінці http://mathworld.wolfram.com/PellEquation.html для вирішення рівняння Pell. Ця функція 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

якщо аргумент являє собою квадрат числа, він поверне один список з 1 лише елемента, sqrt цього числа

  f 4
2 

Якщо це буде залежати від мене, я б віддав перевагу попередньому редагуванню, яке використовує функцію sqrti () ...


1
напевно, ви можете використовувати однолітерні імена замість fqі a0. також: (a×Q)-P->P-⍨a×Q
ngn

Q←Q÷⍨- підтримує нарс Q÷⍨←?
ngn

@ngn: Мені не подобається використовувати "Q ÷ ⍨ ←" у ланцюзі множинних формул присвоєння ... для останньої згоди ... Можливо, це я можу сказати, тому що я побачив C Не визначена поведінка
RosLuP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.