Codegolf - Фундаментальное Решение Уравнения Пелла

  • Автор темы Newpt
  • Обновлено
  • 22, Oct 2024
  • #1

Учитывая некоторое положительное целое число \$n\$, не являющееся квадратом, найдите фундаментальное решение \$(x,y)\$ соответствующего уравнения Пелля.

$$x^2 - n\cdot y^2 = 1$$

Подробности

  • Фундаментальный \$(x,y)\$ — это пара целых чисел \$x,y\$, удовлетворяющая уравнению, где \$x\$ минимально и положительно. (Всегда существует тривиальное решение \$(x,y)=(1,0)\$, которое не учитывается.)
  • Вы можете предположить, что \$n\$ не является квадратом.

Примеры

  n           x    y

1           -    -

2           3    2

3           2    1

4           -    -

5           9    4

6           5    2

7           8    3

8           3    1

9           -    -
10          19    6
11          10    3
12           7    2
13         649    180
14          15    4
15           4    1
16           -    -
17          33    8
18          17    4
19         170    39
20           9    2
21          55    12
22         197    42
23          24    5
24           5    1
25           -    -
26          51    10
27          26    5
28         127    24
29        9801    1820
30          11    2
31        1520    273
32          17    3
33          23    4
34          35    6
35           6    1
36           -    -
37          73    12
38          37    6
39          25    4
40          19    3
41        2049    320
42          13    2
43        3482    531
44         199    30
45         161    24
46       24335    3588
47          48    7
48           7    1
49           -    -
50          99    14
51          50    7
52         649    90
53       66249    9100
54         485    66
55          89    12
56          15    2
57         151    20
58       19603    2574
59         530    69
60          31    4
61  1766319049    226153980
62          63    8
63           8    1
64           -    -
65         129    16
66          65    8
67       48842    5967
68          33    4
69        7775    936
70         251    30
71        3480    413
72          17    2
73     2281249    267000
74        3699    430
75          26    3
76       57799    6630
77         351    40
78          53    6
79          80    9
80           9    1
81           -    -
82         163    18
83          82    9
84          55    6
85      285769    30996
86       10405    1122
87          28    3
88         197    21
89      500001    53000
90          19    2
91        1574    165
92        1151    120
93       12151    1260
94     2143295    221064
95          39    4
96          49    5
97    62809633    6377352
98          99    10
99          10    1
 

Соответствующие последовательности OEIS: А002350 А002349 А033313 А033317

#код-гольф #математика #теория чисел #абстрактная алгебра #полиномы

Newpt


Рег
08 Jan, 2016

Тем
81

Постов
192

Баллов
607
  • 26, Oct 2024
  • #2

Пит, 612 кодов

Берет н со стандартного ввода. Выходы й затем х, разделенные пробелами.

Размер кода 1:

Размер кода 4, для удобства просмотра:

Объяснение

Проверить этот след NPiet, где показана программа, вычисляющая решение для входного значения 99.

Я не уверен, слышал ли я когда-либо об уравнении Пелла до этого задания, поэтому все следующее я взял из Википедии; в частности, эти разделы трех статей:

По сути, мы делаем следующее:

  1. Получите \$n\$ из стандартного ввода.
  2. Найдите \$\lfloor\sqrt n\rfloor\$, увеличивая счетчик до тех пор, пока его площадь не превысит \$n\$, а затем уменьшите его один раз. (Это первый цикл, который вы видите в трассировке, вверху слева.)
  3. Настройте несколько переменных для вычисления \$x\$ и \$y\$ из цепной дроби \$\sqrt n\$.
  4. Проверьте, соответствуют ли \$x\$ и \$y\$ уравнению Пелла. Если да, выведите значения (это ветвь вниз примерно на 2/3 пути), а затем выйдите (врезавшись в красный блок в крайнем левом углу).
  5. Если нет, итеративно обновите переменные и вернитесь к шагу 4. (Это широкий цикл вправо, обратно через низ и воссоединение не совсем на полпути.)

Честно говоря, я понятия не имею, будет ли метод грубой силы короче, и я не собираюсь его пробовать! Хорошо, я попробовал.

 

Сергеййq


Рег
08 Oct, 2011

Тем
68

Постов
178

Баллов
518
  • 26, Oct 2024
  • #3

Пит, 184 кода

Это альтернатива грубой силы, о которой я говорил (в мой другой ответ), что я не хотел писать. Вычисление решения занимает более 2 минут. н = 13. Мне очень не хочется это примерять н = 29... но это проверяется для каждого н до 20, поэтому я уверен, что это правильно.

Как и тот другой ответ, это требует н из стандартного ввода и вывода й затем х, разделенные пробелами.

Размер кода 1:

Размер кода 4, для удобства просмотра:

Объяснение

Вот NPiet трассировка для входного значения 5.

Это самый жестокий из методов грубой силы, перебирающий как \$x\$, так и \$y\$. Другие решения могут перебирать \$x\$ и затем вычислять \$y=\sqrt{\frac{x^2-1}{n}}\$, но они слабаки.

Начиная с \$x=2\$ и \$y=1\$, проверяется, решили ли \$x\$ и \$y\$ уравнение. Если да (вилка внизу справа), он выводит значения и завершает работу.

В противном случае он продолжается влево, где \$y\$ увеличивается и сравнивается с \$x\$. (Затем нужно немного изменить направление, чтобы следовать по зигзагообразному пути.)

В этом последнем сравнении путь разделяется вокруг середины левого угла. Если они равны, \$x\$ увеличивается, а \$y\$ возвращается к 1. И мы возвращаемся к проверке, является ли это решением.

У меня все еще есть свободное пространство, так что, возможно, я посмотрю, смогу ли я включить это вычисление квадратного корня без увеличения программы.

 

Gnhchd


Рег
29 Aug, 2014

Тем
73

Постов
203

Баллов
628
  • 26, Oct 2024
  • #4

Брахилог, 16 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 (x, y) 

Попробуйте онлайн!

Объяснение

f=lambda n,x=2,y=1:x*x-n*y*y-1and f(n,x+(x==y),y*(y<x)+1)or(x,y) ||answer||

Париж/GP, 34 байта

В PARI/GP для этого почти есть встроенная функция: lambda i:[(x,y)for x in range(i**i)for y in range(x)if~-x**2==i*y**2][1] gives the fundamental unit of the квадратичное поле \$\mathbb{Q}(\sqrt{D})\$, где \$D\$ — дискриминант поля. Другими словами, lambda i:next((x,y)for x in range(2,i**i)for y in range(x)if~-x**2==i*y**2) solves the Pell's equation \$x^2 - n \cdot y^2 = \pm 1\$. So I have to take the square when its norm is \$-1\$.

Я не знаю, какой алгоритм он использует, но он работает даже тогда, когда \$n\$ не свободен от квадратов.

Ответы даются в виде n=>{for(int x=2,y;;x++)for(y=0;y<=x;y++)if(x*x-y*y*n==1)return(x,y);} , where y обозначает \$\sqrt{n}\$.

x

Попробуйте онлайн!

 

Aktinida


Рег
28 Apr, 2020

Тем
96

Постов
209

Баллов
729
  • 26, Oct 2024
  • #6

05AB1E, 17 16 14 байт

Сэкономил байт благодаря Кевин Круйссен.
Выходы x

y=x-1

Попробуйте онлайн!

Объяснение

x=2 ||answer||

Java 8, 74 73 72 байта

11v +$\~:1 :}/!?:-1v?=1-*}:{*:@:{*: $ naon;>

-1 байт благодаря @Арно.
-1 байт благодаря @ОливьеГрегойр.

Попробуйте онлайн.

Объяснение:

y ||answer||

R, 66 56 54 53 52 47 45 байт

полная программа

//.

-1 -2 благодаря @Giuseppe

-7 благодаря @Giuseppe и @Robin Ryder

-2 @JAD

 

Vvarsh


Рег
25 Jun, 2005

Тем
68

Постов
199

Баллов
559
  • 26, Oct 2024
  • #7
Желе

, 40 байт

Попробуйте онлайн!

Альтернативный ответ Jelly, менее запутанный, но более эффективный алгоритмически, когда x и y велики. Это находит подходящие дроби правильной цепной дроби, которые приближают квадратный корень из n, а затем проверяет, что решает уравнение Пелла. Теперь правильно находит период правильной цепной дроби.

Благодаря @TimPederick я также реализовал решение на основе целых чисел, которое должно обрабатывать любое число:Желе

{1//.y_/;!NumberQ[x=√(y^2#+1)]:>y+1,x}&

, 68 байт

Попробуйте онлайн! Например, решение для 1234567890

имеет 1936 и 1932 цифры в числителе и знаменателе соответственно.

 

Drivery


Рег
11 Jun, 2010

Тем
65

Постов
210

Баллов
555
  • 26, Oct 2024
  • #8
y

JavaScript (ES7), 47 байт

Попробуйте онлайн! Ниже представлен альтернативный вариант 49 байт

x

версия, которая отслеживает \$x²-1\$ напрямую, а не возводит \$x\$ в квадрат на каждой итерации:

Попробуйте онлайн! Или мы можем пойти нерекурсивным путем для:

fsIJ@ct*TTQ2 2J

50 байт

Попробуйте онлайн!

 

Jsem


Рег
27 Nov, 2007

Тем
71

Постов
188

Баллов
583
  • 26, Oct 2024
  • #9
n->x=1;for(y=0.1d;y%1>0;)y=((++x*x-1)/n)**0.5;x+" "+y

TI-BASIC, 44 42 41 байт
Ввод: \$n\$.

Выходные данные — это список, значения которого соответствуют \$(x,y)\$.
Использует уравнение \$y=\sqrt{\frac{x^2-1}{n}}\$ для \$x\ge2\$ для вычисления фундаментального решения.

Текущая пара \$(x,y)\$ для этого уравнения является фундаментальным решением тогда и только тогда, когда \$y\bmod1=0\$.

⎕fmt pell 1x ┌0─┐ │ 0│ └~─┘ ⎕fmt pell 2x ┌2───┐ │ 3 2│ └~───┘ ⎕fmt pell 3x ┌2───┐ │ 2 1│ └~───┘ ⎕fmt pell 5x ┌2───┐ │ 9 4│ └~───┘ ⎕fmt pell 61x ┌2────────────────────┐ │ 1766319049 226153980│ └~────────────────────┘ ⎕fmt pell 4x ┌0─┐ │ 0│ └~─┘ ⎕fmt pell 7373x ┌2───────────────────────────────────────────────────────────┐ │ 146386147086753607603444659849 1704817376311393106805466060│ └~───────────────────────────────────────────────────────────┘ ⎕fmt pell 1000000000000000000000000000002x ┌2────────────────────────────────────────────────┐ │ 1000000000000000000000000000001 1000000000000000│ └~────────────────────────────────────────────────┘

Примеры:

p^2-w*q^2=1=((-1)^c)*Qnext

Объяснение: Примечание: TI-BASIC — это токенизированный язык. Количество символов делает нет

равное количество байт.

 

Farbod


Рег
06 Apr, 2009

Тем
61

Постов
207

Баллов
532
  • 26, Oct 2024
  • #10
МАТЛ r←sqrti w;i;c;m m←⎕ct⋄⎕ct←0⋄r←1⋄→3×⍳w≤3⋄r←2⋄→3×⍳w≤8⋄r←w÷2⋄c←0 i←⌊(2×r)÷⍨w+r×r⋄→3×⍳1≠×r-i⋄r←i⋄c+←1⋄→2×⍳c<900⋄r←⍬ ⎕ct←m r←pell w;a0;a;p;q2;p2;t;q;P;P1;Q;c;m r←⍬⋄→0×⍳w≤0⋄a0←a←sqrti w⋄→0×⍳a≡⍬⋄m←⎕ct⋄⎕ct←0⋄Q←p←1⋄c←P←P1←q2←p2←0⋄q←÷a L: t←p2+a×p⋄p2←p⋄p←t t←q2+a×q :if c≠0⋄q2←q⋄:endif q←t P←(a×Q)-P →Z×⍳Q=0⋄Q←Q÷⍨w-P×P →Z×⍳Q=0⋄a←⌊Q÷⍨a0+P c+←1⋄→L×⍳(1≠Qׯ1*c)∧c<10000 r←p,q :if c=10000⋄r←⍬⋄:endif Z: ⎕ct←m

Попробуйте онлайн!

Объяснение

Код продолжает увеличивать счетчик к = 1, 2, 3, ... Для каждого к, решения х, й с 1 ≤ хк, 1 ≤ йк разыскиваются. Процесс, когда какое-то решение найдено.

Эта процедура гарантированно находит только одно решение, причем именно фундаментальное. Чтобы понять, почему, обратите внимание, что

  1. Любое решение х>0, й>0 для н>1 удовлетворяет х>й.
  2. Если х,й это решение и х',й' это другое решение, тогда обязательно хх' и йй'.

Как следствие 1 и 2,

  • Когда процедура останавливается на заданном к, только один решение для этого существует к, ведь если бы решений было два, одно из них было бы найдено раньше, и процесс остановился бы при меньшем к.
  • Это решение является фундаментальным, потому что, опять же, если бы существовало решение с меньшими х его нашли бы раньше.
ö ▼ do-while-true with popping k read integer from input î² index of current loop (1-based) squared * multiply the two ) increment (gives the potential x candidate _ duplicate TOS ° is perfect square Þ discard everything but TOS √ square root î index of previous loop (1-based) ||answer||

Питон 2, 49 байт

.0

Попробуйте онлайн!

Находки x.0y as the smallest number above 1 where ökî²*)_°▼Þ√î . Затем находит ḟΛ¤ȯ=→*⁰□π2N Input is n, accessed through ⁰. N Natural numbers: [1,2,3,4,.. π2 2-tuples, ordered by sum: [[1,1],[1,2],[2,1],[1,3],[2,2],.. ḟ Find the first that satisfies this: Λ All adjacent pairs x,y satisfy this: ¤ □ Square both: x²,y² ȯ *⁰ Multiply second number by n: x²,ny² → Increment second number: x²,ny²+1 = These are equal. from ḟΛ¤ȯ=→*⁰□π2N как x, y .

 

Вишеннка


Рег
08 Apr, 2011

Тем
69

Постов
209

Баллов
574
  • 26, Oct 2024
  • #11

Хаскелл, 46 байт

Простой поиск методом грубой силы. При этом используется тот факт, что фундаментальное решение \$(x,y)\$, удовлетворяющее \$x^2 - ny^2 = 1 \$, должно иметь \$y \leq x\$.

n

Попробуйте онлайн!

 

PDV PDV


Рег
23 Oct, 2020

Тем
73

Постов
245

Баллов
670
  • 26, Oct 2024
  • #13

Желе, 15 байт

n=>{int x=1;var y=.1;for(;y%1>0;)y=Math.Sqrt(-x*~++x/n);return(x,y);}

Попробуйте онлайн!

Полная программа, принимающая один аргумент f n=[(x,y)|x<-[1..],y<-[1..x],x^2-n*y^2==1]!!0 and returns a tuple of y = floor(x / sqrt(n)) .

 

Akela1328


Рег
08 Nov, 2019

Тем
69

Постов
172

Баллов
537
  • 26, Oct 2024
  • #14

Шелуха, 12 байт

x

Попробуйте онлайн!

Объяснение

y ||answer||

МатематикаГольф, 12 байт

x % sqrt(n) <= 1/x

Попробуйте онлайн!

Когда дело доходит до форматирования вывода, я выражаю благодарность «Радуйся, Мария». Если это запрещено, у меня есть решение на 1 байт длиннее. Выходной формат: x , where a=input()**.5 x=2 while x%a*x>1:x+=1 print x,x//a является разделителем между двумя числами.

Объяснение

` % Do...while @:U % Push row vector [1^2, 2^2, ..., k^2] where k is the iteration index t! % Duplicate and transpose. Gives the column vector [1^2; 2^2; ...; k^2] G* % Multiply by input n, element-wise. Gives [n*1^2; n*2^2; ...; n*k^2] - % Subtract with broadcast. Gives a square matrix of size n ! % Transpose, so that x corresponds to row index and y to column index 1=&f % Push row and column indices of all entries that equal 1. There can % only be (a) zero such entries, in which case the results are [], [], % or (b) one such entry, in which case the results are the solution x, y ts~ % Duplicate, sum, negate. This gives 1 in case (a) or 0 in case (b) % End (implicit). Proceed with next iteration if top of the stack is true; % that is, if no solution was found. % Display (implicit). The stack contains copies of [], and x, y on top. % The empty array [] is not displayed

Я черпал вдохновение из ответа Эмигны 05AB1E, но смог найти некоторые улучшения. Если выбранный мной разделитель недопустим, добавьте пробел перед последним байтом, чтобы количество байтов было равно 13.

 

Светлана Солодкая


Рег
30 Jan, 2015

Тем
57

Постов
187

Баллов
492
  • 26, Oct 2024
  • #15

APL(NARS), 906 байт

`@:Ut!G*-!1=&fts~

Выше есть две функции: функция sqrti, которая находит квадратный корень пола, и функция pell, возвращающая Zilde об ошибке и основанная на чтении страницы. http://mathworld.wolfram.com/PellEquation.html он будет использовать алгоритм для знания sqrt числа, продолжая дробь (даже если я использую один алгоритм для знания sqrt, используя

Ans→N:"√(N⁻¹(X²+1→Y₁:1→X:Repeat not(fPart(Ans:X+1→X:Y₁:End:{X,Ans ;full logic Ans→N ;store the input in "N" "√(N⁻¹(X²+1→Y₁ ;store the aforementioned ; equation into the first ; function variable 1→X ;store 1 in "X" Repeat not(fPart(Ans End ;loop until "Ans" is ; an integer X+1→X ;increment "X" by 1 Y₁ ;evaluate the function ; stored in this variable ; at "X" and leave the ; result in "Ans" {X,Ans ;create a list whose ; values contain "X" and ; "Ans" and leave it in ; "Ans" ;implicitly print "Ans"

метод Ньютона) и остановится, когда найдет p и q такие, что

6 6 prgmCDGF12 {5 2} 10 10 prgmCDGF12 {19 6} 13 13 prgmCDGF12 {649 180}

Тест:

Существует ограничение на циклы в цикле в функции sqrti и ограничение на циклы в цикле в функции Пелла, оба из которых возможно, что число случаев слишком велико или алгоритм не сходится... (Я не знаю, является ли sqrti сходятся все возможные входные данные и то же самое с функцией Пелла)

 

Assilicky22


Рег
25 Oct, 2024

Тем
70

Постов
176

Баллов
576
  • 26, Oct 2024
  • #18
Язык Wolfram (Математика) U×_?/;²®_$÷2ị$}ʋ¥µ;+®Æ½W¤:/$$ ¹©Æ½Ø.;ÇƬṪ€F¹;Ḋ$LḂ$??@ṫ-ṚZæ.ʋ¥ƒØ.,U¤-ị

½©%1İ$<®‘¤$п¹;Ḋ$LḂ$?Ḟ?@ṫ-ṚZæ.ʋ¥ƒØ.,U¤-ị is the 3-byte Unicode character #221A. Outputs the solution in the order (y,x) instead of (x,y). As usual with the imperfect n=scan();while((x=(1+n*T^2)^.5)%%1)T=T+1;x;+T , 41 байт n->{ // Method with double parameter and string return-type int x=1; // Integer `x`, starting at 1 var y=.1; // Double `y`, starting at 0.1 for(;y%1>0;) // Loop as long as `y` contains decimal digits: y= // Set `y` to: Math.sqrt( // The square-root of: -x* // Negative `x`, multiplied by ~++x // `(-x-2)` (or `-(x+1)-1)` to be exact) // (because we increase `x` by 1 first with `++x`) /n); // Divided by the input return x+" "+y;} // After the loop, return `x` and `y` with space-delimiter as result is at most 65538.

и его ограниченные итерации работают только на входных данных, где истинное значение

Попробуйте онлайн!

 

Stolnik


Рег
06 Jul, 2006

Тем
76

Постов
202

Баллов
602
  • 26, Oct 2024
  • #19
><> n->{int x=1;var y=.1;for(;y%1>0;)y=Math.sqrt(-x*~++x/n);return x+" "+y;}

, 45 байт

Попробуйте онлайн! ∞ # from the infinite list of numbers [1 ...] .Δ } # find the first number that returns true under n # square * # multiply with input > # increment t© # sqrt (and save to register as potential x) 1% # modulus 1 _ # logical negation ®‚ # pair result (y) with register (x) upwards, with ∞.Δn*>t©1%_}®‚ Алгоритм перебора, поиск из [y, x] when FindInstance[x^2-y^2#==1&&x>1,{x,y},Integers]& и уменьшаясь в каждом цикле, увеличивая n->(a=quadunit(4*n))*a^(norm(a)<0) followed by w достигает 0. Выходной сигнал

, разделенные новой строкой.

 

Rastaman


Рег
10 Jan, 2014

Тем
73

Постов
190

Баллов
585
  • 26, Oct 2024
  • #22
Питон 2 ;1↔ Take the list [1, Input] ;Ċz Zip it with a couple of two unknown variables: [[1,I],[Input,J]] ×ᵐ Map multiply: [I, Input×J] -1 I - Input×J must be equal to 1 ∧ (and) Ċ√ᵐ We are looking for the square roots of these two unknown variables ℕᵐ And they must be natural numbers (implicit attempt to find values that match those constraints)

, 64 байта

Попробуйте онлайн! ;1↔;Ċz×ᵐ-1∧Ċ√ᵐℕᵐ .

 

ReWarrior


Рег
28 Oct, 2013

Тем
80

Постов
187

Баллов
627
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно