โซลูชันพื้นฐานของสมการเพลล์


28

รับจำนวนเต็มบวกnที่ไม่ใช่จตุรัสหาวิธีแก้ปัญหาพื้นฐาน(x,y)ของสมการเพลล์ที่เกี่ยวข้อง

x2ny2=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 ที่เกี่ยวข้อง: A002350 A002349 A033313 A033317


แปลกใจที่ยังไม่มีความท้าทายใด ๆ กับสมการเพลล์เนื่องจากเป็นที่รู้จักกันดี อย่างน้อยฉันก็จำได้ว่าใช้มันกับความท้าทาย Project Euler
Kevin Cruijssen

@ สรุป " คุณสามารถสันนิษฐานได้ว่าไม่ใช่สแควร์n " อาจจะชัดเจนกว่าถ้ากรณีทดสอบละเว้น imho เหล่านั้น
Kevin Cruijssen

2
@KevinCruijssen ฉันพิจารณาแล้ว แต่ฉันคิดว่ามันจะสับสนมากกว่าที่จะละnไว้ (btw ฉันก็ประหลาดใจ แต่ฉันมีความท้าทายนี้ในกล่องทรายประมาณหนึ่งปี)
ข้อบกพร่อง

ที่เกี่ยวข้อง: projecteuler.net/problem=66
steenbergh

คำตอบ:


16

Piet , 612 codels

รับnจากอินพุตมาตรฐาน เอาต์พุตyจากนั้นxคั่นด้วยช่องว่าง

Codel ขนาด 1: Pell's equation program with codel size 1

Codel size 4 เพื่อการดูที่ง่ายขึ้น: Pell's equation program with codel size 1

คำอธิบาย

ตรวจสอบการติดตาม NPiet นี้ซึ่งแสดงโปรแกรมคำนวณโซลูชันสำหรับค่าอินพุตที่ 99

ฉันไม่แน่ใจว่าฉันเคยได้ยินเกี่ยวกับสมการของเพลล์ก่อนหน้าการท้าทายนี้หรือไม่ดังนั้นฉันจึงได้รับสิ่งต่อไปนี้ทั้งหมดจาก Wikipedia โดยเฉพาะหัวข้อเหล่านี้ของสามบทความ:

โดยทั่วไปสิ่งที่เราทำคือ:

  1. รับnจากอินพุตมาตรฐาน
  2. ค้นหาnโดยการเพิ่มตัวนับจนกว่าสี่เหลี่ยมจัตุรัสจะเกินnจากนั้นลดลงหนึ่งครั้ง (นี่คือลูปแรกที่คุณสามารถเห็นได้ในร่องรอยที่ด้านซ้ายบน)
  3. ตั้งค่าตัวแปรบางตัวสำหรับการคำนวณxและyจากเศษส่วนต่อเนื่องของn .
  4. ตรวจสอบว่าxและyสอดคล้องกับสมการของเพลล์หรือไม่ หากเป็นเช่นนั้นให้ส่งออกค่า (นี่คือสาขาด้านล่างประมาณ 2/3 ของทางข้าม) จากนั้นออก (โดยเรียกใช้เข้าไปในบล็อกสีแดงที่ด้านซ้ายสุด)
  5. ถ้าไม่มีให้ทำซ้ำอัปเดตตัวแปรแล้วย้อนกลับไปที่ขั้นตอนที่ 4 (นี่เป็นการวนซ้ำที่กว้างไปทางขวาย้อนกลับไปด้านล่างและเข้าร่วมไม่ได้ครึ่งทาง)

ฉันไม่ทราบเลยว่าวิธีการที่โหดร้ายกำลังจะสั้นลงหรือไม่และฉันไม่ได้ลอง! โอเคฉันลองแล้ว


9

Piet , 184 codels

นี่เป็นทางเลือกที่ไร้เดียงสาที่ฉันพูด (ในคำตอบอื่น ๆ ของฉัน ) ที่ฉันไม่ต้องการเขียน ใช้เวลาในการคำนวณโซลูชันนานกว่า 2 นาทีสำหรับn = 13 ฉันไม่ต้องการลองใช้กับn = 29 ... แต่จะตรวจสอบทุกครั้ง nสูงสุด 20 ดังนั้นฉันมั่นใจว่าถูกต้อง

เช่นเดียวกับคำตอบอื่น ๆ ซึ่งใช้nจากอินพุตมาตรฐานและเอาต์พุตyจากนั้นxคั่นด้วยช่องว่าง

Codel ขนาด 1: Pell's equation program (brute-force variant) with codel size 1

Codel size 4 เพื่อการดูที่ง่ายขึ้น: Pell's equation program (brute-force variant) with codel size 4

คำอธิบาย

นี่คือการติดตาม NPietสำหรับค่าอินพุต 5

นี่คือสุดโหดของแรงเดรัจฉานวนทั้งxและy ที่yวิธีแก้ปัญหาอื่นอาจทำซ้ำมากกว่าxแล้วคำนวณy=x21nแต่พวกเขากำลังwimps

เริ่มต้นจากx=2และy=1สิ่งนี้จะตรวจสอบว่าxและyได้แก้สมการหรือยัง ถ้ามันมี (ทางแยกที่ด้านล่างใกล้กับด้านขวา) มันจะส่งออกค่าและออก

ถ้าไม่ใช่มันยังคงอยู่ต่อไปโดยที่yเพิ่มขึ้นและเปรียบเทียบกับx x(จากนั้นมีทิศทางที่ twiddling เพื่อไปตามเส้นทางซิกแซก)

การเปรียบเทียบล่าสุดนี้เป็นที่ที่เส้นทางแยกรอบกลางซ้าย หากพวกเขาเท่ากันxจะเพิ่มขึ้นและyถูกตั้งค่าเป็น 1 และเรากลับไปที่การตรวจสอบว่ามันเป็นทางออกหรือไม่

ฉันยังคงมีพื้นที่ว่างบางส่วนดังนั้นฉันอาจดูว่าฉันสามารถรวมการคำนวณสแควร์รูทนั้นได้หรือไม่โดยไม่ต้องขยายโปรแกรม


2
ฮ่าฮ่าฉันเห็นด้วยกับwimpsที่ใช้รากที่สอง: D
ข้อบกพร่อง

6

Brachylogขนาด 16 ไบต์

;1↔;Ċz×ᵐ-1∧Ċ√ᵐℕᵐ

ลองออนไลน์!

คำอธิบาย

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

5

Pari / GP , 34 ไบต์

PARI / GP เกือบจะมีในตัวสำหรับสิ่งนี้: quadunitให้หน่วยพื้นฐานของสนามสม การกำลังสองQ(D)โดยที่Dคือตัวเลือกของฟิลด์ ในคำอื่น ๆquadunit(4*n)แก้สมการเพลล์ของx2ny2=±11 ดังนั้นผมจึงต้องใช้ตารางเมื่อบรรทัดฐานของมันคือ11

ฉันไม่รู้ว่ามันใช้อัลกอริทึมอย่างไร แต่มันก็ใช้ได้ดีเมื่อnไม่ได้เป็นรูปสี่เหลี่ยมจัตุรัส

คำตอบจะได้รับในรูปแบบx + y*wที่wซึกn .

n->(a=quadunit(4*n))*a^(norm(a)<0)

ลองออนไลน์!


4

ภาษา Wolfram (Mathematica)ขนาด 46 ไบต์

FindInstance[x^2-y^2#==1&&x>1,{x,y},Integers]&

ลองออนไลน์!


1
มั่นใจได้หรือไม่ว่าสิ่งนี้จะพบทางออกพื้นฐานเสมอ
เกร็กมาร์ติน

@ GregMartin ใช่มันเป็นสิ่งนี้มักจะหาทางออก (ขั้นต่ำ) แรก ในกรณีนี้จะส่งคืน {1,0} เสมอ นั่นคือเหตุผลที่เราต้องเลือก x> 1 และได้รับการแก้ปัญหาที่สอง (พื้นฐาน)
J42161217

1
ผมอยากที่จะเป็นจริง แต่ไม่มีอะไรในเอกสารดูเหมือนจะบ่งบอกว่า ....
เกร็กมาร์ติน

@GregMartin ฉันได้ใช้ฟังก์ชั่นนี้หลายครั้งและรู้แล้วว่ามันทำงานอย่างไร ความกังวลเพียงอย่างเดียวของฉันคือการข้ามโซลูชันแรกและนั่นทำให้ฉันมีค่าเพิ่ม 5 ไบต์ คุณสามารถเขียนโปรแกรมและทดสอบ (เพื่อยืนยันผลลัพธ์หลายล้านรายการ)
J42161217

4

05AB1E , 17 16 14 ไบต์

บันทึกขอบคุณไบต์เควิน Cruijssen
เอาท์พุท[y, x]

∞.Δn*>t©1%_}®‚

ลองออนไลน์!

คำอธิบาย

∞                 # 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)

และคุณเอาชนะฉันอีกครั้ง .. มี 17 byter เช่นกัน แต่มันใช้งานไม่ได้เพราะŲถูกบดบังด้วยทศนิยม .. > <อย่างไรก็ตามคุณสามารถลบทั้งสอง,และเพิ่มส่วนท้ายได้(ไม่คอมม่าไม่ใช่ เดียวกัน; p) เพื่อบันทึกไบต์
Kevin Cruijssen

@KevinCruijssen: ขอบคุณ! ใช่ฉันไปด้วยŲก่อนสังเกตว่ามันไม่ทำงานอย่างที่คาดไว้
Emigna

4

Java 8, 74 73 72 ไบต์

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

-1 ขอบคุณไบต์@Arnauld
-1 ขอบคุณไบต์@ OlivierGrégoire

ลองออนไลน์

คำอธิบาย:

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

1
72 ไบต์โดยการเปลี่ยนnไปdoubleและxกับผู้intเล่นในความจริงที่ว่ามีค่าเท่ากับx*x-1 (-x-1)*(-x+1)
Olivier Grégoire

จริง ๆ แล้วฉันเล่นกับความจริงที่(x+1)*(x+1)-1เท่ากับ-x*-(x+2)ถูกต้องทั้งหมด
Olivier Grégoire

3

R, 66 56 54 53 52 47 45 ไบต์

โปรแกรมเต็มรูปแบบ

n=scan();while((x=(1+n*T^2)^.5)%%1)T=T+1;x;+T

-1 -2ขอบคุณ @Giuseppe

-7 ขอบคุณ @Giuseppe & @Robin Ryder -2 @JAD


1
ใช้.5แทน0.5
Giuseppe

5
46 ไบต์ การหาค่าที่น้อยที่สุดของเทียบเท่ากับการหาค่าที่น้อยที่สุดของx yวิธีนี้ช่วยให้คุณประหยัด 2 ไบต์เนื่องจากการแสดงxในแง่ของyสั้นกว่าอีกวิธีหนึ่งและ 4 ไบต์โดยใช้เคล็ดลับการใช้Tซึ่งเริ่มต้นได้ที่ 1
Robin Ryder

1
@RobinRyder คุณอาจต้องการ+Tที่สิ้นสุดเพื่อให้แน่ใจว่าเมื่อy==1มันกลับมา1แทนTRUEแต่ฉันไม่แน่ใจทั้งหมด
Giuseppe

3
@Giuseppe เห็นดี! คุณพูดถูก นั่นทำให้มัน47 ไบต์
Robin Ryder

1
ดูเหมือนจะล้มเหลวใน n = 61 (กรณีทดสอบขนาดใหญ่โง่) เนื่องจากปัญหาจำนวนมาก ฉันคิดว่าการอนุญาตให้ จำกัด ภาษาทำได้ดีเพียงสังเกตข้อยกเว้น
CriminallyVulgar

3

เยลลี่ขนาด 40 ไบต์

½©%1İ$<®‘¤$п¹;Ḋ$LḂ$?Ḟṭ@ṫ-ṚZæ.ʋ¥ƒØ.,U¤-ị

ลองออนไลน์!

คำตอบของทางเลือกอื่นคือเยลลี่กอล์ฟน้อย แต่มีอัลกอริธึมที่มีประสิทธิภาพมากกว่าเมื่อ x และ y มีขนาดใหญ่ สิ่งนี้จะพบคอนเวอร์เจนต์ของเศษส่วนต่อเนื่องปกติที่ประมาณสแควร์รูทของ n แล้วตรวจสอบว่าแก้สมการเพลล์ได้ไหม ตอนนี้อย่างถูกต้องค้นหาระยะเวลาของเศษส่วนต่อเนื่องปกติ

ขอบคุณ @TimPederick ฉันยังได้ใช้โซลูชันที่เป็นจำนวนเต็มซึ่งควรจัดการกับหมายเลขใด ๆ :

เยลลี่ 68 ไบต์

U×_ƭ/;²®_$÷2ị$}ʋ¥µ;+®Æ½W¤:/$$
¹©Æ½Ø.;ÇƬṪ€F¹;Ḋ$LḂ$?ṭ@ṫ-ṚZæ.ʋ¥ƒØ.,U¤-ị

ลองออนไลน์!

ตัวอย่างเช่นโซลูชันสำหรับ 1234567890มี 1936 และ 1932 หลักสำหรับตัวเศษและส่วนตามลำดับ


ดี! ฉันใช้วิธีการเดียวกันในคำตอบของฉัน ฉันไม่ได้อ่าน Jelly ดังนั้นฉันไม่แน่ใจว่าทำไมคุณถึงมีปัญหากับ 61. คุณเก็บค่าคอนเวอร์เจนต์แต่ละรายการเป็นจำนวนเต็มคู่ (ตัวเศษและส่วน) หรือไม่
ทิม Pederick

@TimPederick ใช่ ไม่แน่ใจว่าเกิดปัญหาขึ้นที่ใด
Nick Kennedy

ฉันพยายามเรียนรู้วิธีการทำงานนี้เพื่อให้ฉันสามารถช่วยแก้ไขข้อบกพร่องได้ แต่ฉันไม่สามารถห่อหัวของฉันรอบ ๆ มันได้! สิ่งเดียวที่ผมสามารถแนะนำคือการชั้นลอยใด ๆ ตั้งแต่ (ถ้านี้ไม่ใช้วิธีเดียวกับเหมือง) ค่ากลางทุกคนควรจะออกมาเป็นค่าจำนวนเต็ม
ทิม Pederick

@ TimPederick มันไม่ถูกต้องจุดลอยตัว ตอนนี้ฉันทำให้มันหยุดมองหาความต่อเนื่องของเศษส่วนต่อเนื่องเมื่อถึงระยะเวลา ทำงานได้ถึง 150 แต่เหนือกว่าที่ฉันคิดอีกครั้งฉันพบข้อผิดพลาดความแม่นยำจุดลอยตัวที่เช่น 151
Nick Kennedy

@TimPederick also it’s the generation of the continued fraction that’s problematic, not the convergents which are done with integer arithmetic.
Nick Kennedy

2

JavaScript (ES7), 47 bytes

n=>(g=x=>(y=((x*x-1)/n)**.5)%1?g(x+1):[x,y])(2)

Try it online!

Below is an alternate 49-byte version which keeps track of x²1 directly instead of squaring x at each iteration:

n=>[(g=x=>(y=(x/n)**.5)%1?1+g(x+=k+=2):2)(k=3),y]

Try it online!

Or we can go the non-recursive way for 50 bytes:

n=>eval('for(x=1;(y=((++x*x-1)/n)**.5)%1;);[x,y]')

Try it online!


2

TI-BASIC,  44  42 41 bytes

Ans→N:"√(N⁻¹(X²-1→Y₁:1→X:Repeat not(fPart(Ans:X+1→X:Y₁:End:{X,Ans

Input is n.
Output is a list whose values correspond to (x,y).

Uses the equation y=x21n for x2 to calculate the fundamental solution.
The current (x,y) pair for that equation is a fundamental solution iff ymod1=0.

Examples:

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

Explanation:

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"

Note: TI-BASIC is a tokenized language. Character count does not equal byte count.


2

MATL, 17 bytes

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

Try it online!

Explanation

The code keeps increasing a counter k = 1, 2, 3, ... For each k, solutions x, y with 1 ≤ xk, 1 ≤ yk are searched. The process when some solution if found.

This procedure is guaranteed to find only one solution, which is precisely the fundamental one. To see why, note that

  1. Any solution x>0, y>0 for n>1 satisfies x>y.
  2. If x,y is a solution and x',y' is a different solution then necessarily xx' and yy'.

As a consequence of 1 and 2,

  • When the procedure stops at a given k, only one solution exists for that k, because if there were two solutions one of them would been found earlier, and the process would have stopped with a smaller k.
  • This solution is the fundamental one, because, again, if there were a solution with smaller x it would have been found earlier.

`       % 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


2

Haskell, 46 bytes

A straightforward brute force search. This makes use of the fact that a fundamental solution (x,y) satisfying x2ny2=1 must have yx.

f n=[(x,y)|x<-[1..],y<-[1..x],x^2-n*y^2==1]!!0

Try it online!


It seems like you need to change n to x in y<-[1..n] so you can compute f 13.
Christian Sievers

@ChristianSievers Thanks for pointing it out, I corrected it!
flawr



1

Husk, 12 bytes

ḟΛ¤ȯ=→*⁰□π2N

Try it online!

Explanation

ḟΛ¤ȯ=→*⁰□π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.

1

MathGolf, 12 bytes

ökî²*)_°▼Þ√î

Try it online!

I'm throwing a Hail Mary when it comes to the output formatting. If it's not allowed, I have a solution which is 1 byte longer. The output format is x.0y, where .0 is the separator between the two numbers.

Explanation

ö       ▼      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)

I took some inspiration from Emigna's 05AB1E answer, but was able to find some improvements. If the separator I chose is not allowed, add a space before the last byte for a byte count of 13.


1

APL(NARS), 906 bytes

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

Above there are 2 functions sqrti function that would find the floor square root and pell function would return Zilde for error, and is based reading the page http://mathworld.wolfram.com/PellEquation.html it would use the algo for know the sqrt of a number trhu continue fraction (even if i use one algo for know sqrt using newton method) and stop when it find p and q such that

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

Test:

  ⎕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│
└~────────────────────────────────────────────────┘

There is a limit for cycles in the loop in sqrti function, and a limit for cycles for the loop in Pell function, both for the possible case number are too much big or algo not converge... (I don't know if sqrti converge every possible input and the same the Pell function too)





0

><>, 45 bytes

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

Try it online!

Brute force algorithm, searching from x=2 upwards, with y=x-1 and decrementing on each loop, incrementing x when y reaches 0. Output is x followed by y, separated by a newline.



0

Python 3, 75 bytes

lambda i:next((x,y)for x in range(2,i**i)for y in range(x)if~-x**2==i*y**2)

Try it online!

Explanation

Brute force. Using

x<ii
as an upper search bound, which is well below the definite upper limit of the fundamental solution to Pell's equation
xi!

This code would also run in Python 2. However, the range() function in Python 2 creates a list instead of a generator like in Python 3 and is thus immensely inefficient.


With inifinte time and memory, one could use a list comprehension instead of the iterator and save 3 bytes like so:

Python 3, 72 bytes

lambda i:[(x,y)for x in range(i**i)for y in range(x)if~-x**2==i*y**2][1]

Try it online!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.