Определение непрерывных дробей квадратных корней


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))а не встроенная переменная . Но первый - встроенный.

Принимает ввод на стандартный ввод и выводит на стандартный вывод.

Псевдокод алгоритма (доказательство правильности в настоящее время оставлено в качестве упражнения для читателя):

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;)
Питер Тейлор

3

Питон, 95 97 (но правильно ...)

При этом используются только целочисленная арифметика и деление по полу. Это даст правильные результаты для всех положительных целочисленных входных данных, хотя, если кто-то хочет использовать long, ему придется добавить символ; например 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, я недостаточно внимательно прочитал задачу и заставил код работать для идеальных квадратов.
Boothby

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. Однако, если длина последовательности становится намного больше (√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@#&
доктор Белизарий

Что именно вы здесь рассчитываете? Это программа, которая принимает ввод от стандартного ввода? Потому что, как вы используете, это выглядит как тело функции без определения функции.
Питер Тейлор

@ Питер Тейлор Пожалуйста, смотрите поправку.
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 основана на алгоритме, найденном на странице 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

если аргумент является квадратом числа, он возвращает один список из 1 единственного элемента, квадрат этого числа

  f 4
2 

Если бы это зависело от меня, в одном упражнении без «codegolf» я бы предпочел предыдущее редактирование с использованием функции sqrti () ...


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

Q←Q÷⍨- nars поддерживает Q÷⍨←?
нгн

@ngn: Мне не нравится использовать «Q ÷ ⍨ ←» в цепочке формулы множественного назначения ... для оставшихся согласен ... Возможно, я говорю это, потому что видел C Undefined Behavior
RosLuP
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.