【学习笔记】Pell方程

280 篇文章 1 订阅

说明:
文中的分数 p q \frac{p}{q} qp 不一定满足 gcd ⁡ ( p , q ) = 1 \gcd(p,q)=1 gcd(p,q)=1 ,也未必 p , q ∈ Z p,q\in\Z p,qZ
由于结论是需要证明的,所以结论用 ∴ \therefore 作开头,以强调。

1.概述

有关 x , y x,y x,y 的方程 x 2 − n y 2 = 1 ( n ∈ Z , n ≠ 0 ) x^2-ny^2=1\quad(n\in\Z,n\ne 0) x2ny2=1(nZ,n=0)

被称为 P e l l Pell Pell 方程。我们要处理的是 x , y x,y x,y 的正整数解。

不难发现, n < 0 n<0 n<0 时,无正整数解;在 n = 0 n=0 n=0 时,额……;在 n > 0 n>0 n>0 n ∈ Z \sqrt{n}\in\Z n Z 时,令 t = y n ∈ N + t=y\sqrt{n}\in\N^+ t=yn N+ ,方程转化为 x 2 − t 2 = 1 x^2-t^2=1 x2t2=1 ,无正整数解。

所以,我们实际上考虑的是

∴ x 2 − n y 2 = 1 ( x , y , n ∈ N + , n ∉ Z ) \therefore x^2-ny^2=1\quad(x,y,n\in\N^+,\sqrt{n}\not\in\Z) x2ny2=1(x,y,nN+,n Z)

2.连分数

推荐刊物:数学吧之连分数,蛮不错的。

1.定义

我们仅研究简单连分数 a 0 + 1 a 1 + 1 a 2 + 1 a 3 + ⋯ a_0+\frac{1}{a_1+\frac{1}{a_2+\frac{1}{a_3+\cdots}}} a0+a1+a2+a3+111

可能是有限的,也可能是无限的。用一种更简单的形式表达,可写成

[ a 0 ; a 1 , a 2 , …   ] [a_0;a_1,a_2,\dots] [a0;a1,a2,]

倘若有限,一般会给出项数 [ a 0 ; a 1 , a 2 , … , a k ] [a_0;a_1,a_2,\dots,a_k] [a0;a1,a2,,ak]

2.计算

显然我们有 [ a 0 ; a 1 , a 2 , … , a k ] = a 0 + 1 [ a 1 ; a 2 , a 3 , … , a k ] [a_0;a_1,a_2,\dots,a_k]=a_0+\frac{1}{[a_1;a_2,a_3,\dots,a_k]} [a0;a1,a2,,ak]=a0+[a1;a2,a3,,ak]1

也可能是无限连分数。但是,倘若 [ a 1 ; a 2 , a 3 , … , a k ] = p q [a_1;a_2,a_3,\dots,a_k]=\frac{p}{q} [a1;a2,a3,,ak]=qp

(或者所谓的 lim ⁡ k → + ∞ [ a 1 ; a 2 , a 3 , … , a k ] = p q \lim_{k\rightarrow+\infty}[a_1;a_2,a_3,\dots,a_k]=\frac{p}{q} limk+[a1;a2,a3,,ak]=qp ),那么我们有

∴ [ a 0 ; a 1 , a 2 , … , a k ] = q + a 0 p p \therefore [a_0;a_1,a_2,\dots,a_k]=\frac{q+a_0p}{p} [a0;a1,a2,,ak]=pq+a0p

3.渐进分数

1.定义

定义一个连分数 a a a k k k 阶渐进分数 p k q k = [ a 0 ; a 1 , a 2 , … , a k ] \frac{p_k}{q_k}=[a_0;a_1,a_2,\dots,a_k] qkpk=[a0;a1,a2,,ak]

注意,原连分数的长度可能是任意一个不小于 k k k 的值,或者是无限连分数。

2.性质

对于任意 k ( k ≥ 2 ) k(k\ge 2) k(k2) ,我们有

∴ { p k = a k p k − 1 + p k − 2 q k = a k q k − 1 + q k − 2 \therefore\begin{cases} p_k=a_kp_{k-1}+p_{k-2}\\ q_k=a_kq_{k-1}+q_{k-2} \end{cases} {pk=akpk1+pk2qk=akqk1+qk2

该定理可以使用数学归纳法证明。在 k = 2 k=2 k=2 时不难验证;对于 k ( k > 2 ) k(k>2) k(k>2) 的情况,记连分数 a ′ = [ a 1 ; a 2 , a 3 , … , a k ] a'=[a_1;a_2,a_3,\dots,a_k] a=[a1;a2,a3,,ak] 的渐进分数为 p ′ q ′ \frac{p'}{q'} qp ,由归纳法有

{ p k ′ = a k p k − 1 ′ + p k − 2 ′ q k ′ = a k q k − 1 ′ + q k − 2 ′ \begin{cases} p'_k=a_kp'_{k-1}+p'_{k-2}\\ q'_k=a_kq'_{k-1}+q'_{k-2} \end{cases} {pk=akpk1+pk2qk=akqk1+qk2

2.3 告诉我们

{ p k = a 0 p k ′ + q k ′ q k = p k ′ \begin{cases} p_k=a_0p'_k+q'_k\\ q_k=p'_k \end{cases} {pk=a0pk+qkqk=pk

将角标换成 k − 1 k-1 k1 k − 2 k-2 k2 自然也成立。进一步推导有

p k = a 0 ( a k p k − 1 ′ + p k − 2 ′ ) + ( a k q k − 1 ′ + q k − 2 ′ ) = a k ( a 0 p k − 1 ′ + q k − 1 ′ ) + ( a 0 p k − 2 ′ + q k − 2 ′ ) = a k p k − 1 + p k − 2 \begin{aligned} p_k&=a_0(a_kp'_{k-1}+p'_{k-2})+(a_kq'_{k-1}+q'_{k-2})\\ &=a_k(a_0p'_{k-1}+q'_{k-1})+(a_0p'_{k-2}+q'_{k-2})\\ &=a_kp_{k-1}+p_{k-2} \end{aligned} pk=a0(akpk1+pk2)+(akqk1+qk2)=ak(a0pk1+qk1)+(a0pk2+qk2)=akpk1+pk2

q q q 便不展开了,可自证,无任何难度。

3.新的约定

我们规定

{ p − 1 = 1 q − 1 = 0 , { p − 2 = 0 q − 2 = 1 \begin{cases} p_{-1}=1\\ q_{-1}=0 \end{cases} , \begin{cases} p_{-2}=0\\ q_{-2}=1 \end{cases} {p1=1q1=0,{p2=0q2=1

这会使得 2.3.2 对于任意 k ∈ N k\in\N kN 都成立。

4.重要结论

2.3.2 中的公式,上式乘 q k − 1 q_{k-1} qk1 得到

p k q k − 1 = a k p k − 1 q k − 1 + p k − 2 q k − 1 (1) p_kq_{k-1}=a_kp_{k-1}q_{k-1}+p_{k-2}q_{k-1}\tag{1} pkqk1=akpk1qk1+pk2qk1(1)

下式乘 p k − 1 p_{k-1} pk1 得到

q k p k − 1 = a k q k − 1 p k − 1 + q k − 2 p k − 1 (2) q_kp_{k-1}=a_kq_{k-1}p_{k-1}+q_{k-2}p_{k-1}\tag{2} qkpk1=akqk1pk1+qk2pk1(2)

( 2 ) (2) (2) − ( 1 ) -(1) (1) 式得到

q k p k − 1 − p k q k − 1 = − ( q k − 1 p k − 2 − p k − 1 q k − 2 ) q_kp_{k-1}-p_kq_{k-1}=-(q_{k-1}p_{k-2}-p_{k-1}q_{k-2}) qkpk1pkqk1=(qk1pk2pk1qk2)

左右两边的形式是相仿的,我们可以定义新数列 { q n p n − 1 − p n q n − 1 } \{q_{n}p_{n-1}-p_{n}q_{n-1}\} {qnpn1pnqn1} ,结合首项 q 0 p − 1 − p 0 q − 1 = 1 q_0p_{-1}-p_{0}q_{-1}=1 q0p1p0q1=1 推出

∴ q k p k − 1 − p k q k − 1 = ( − 1 ) k \therefore q_{k}p_{k-1}-p_kq_{k-1}=(-1)^k qkpk1pkqk1=(1)k

4.逼近无理数

杨中和《二次无理数的连分数》讲的非常清楚,严谨。果然还是要看专业文献。

设我们正在展开 n + b c \frac{\sqrt{n}+b}{c} cn +b ,满足 b ∈ Z , c ∈ N + b\in\Z,c\in\N^+ bZ,cN+ 。不妨设其值为 a + 1 r a+\frac{1}{r} a+r1 ,其中 a ∈ Z a\in\Z aZ ,而 r r r 是另一个连分数。由于 r ∈ ( 1 , + ∞ )    ⇔    1 r ∈ ( 0 , 1 ) r\in(1,+\infty)\;\Leftrightarrow\;\frac{1}{r}\in(0,1) r(1,+)r1(0,1) ,我们要取最大的 a a a ,具体方案是

maximize    b ′ ≤ n , s.t.    c ∣ ( b + b ′ ) \text{maximize}\;b'\le\sqrt{n},\text{s.t.}\;c|(b+b') maximizebn ,s.t.c(b+b)

然后我们就有

a = b + b ′ c    r = n + b ′ ( n − b ′ ⋅ b ′ ) / c a=\frac{b+b'}{c}\\ \;\\ r=\frac{\sqrt{n}+b'}{(n-b'\cdot b')/c} a=cb+br=(nbb)/cn +b

r r r 是化简后的结果。分母有理化就不在这里进行了。下证 n − b ′ ⋅ b ′ c ∈ N + \frac{n-b'\cdot b'}{c}\in\N^+ cnbbN+

  • 注意到 b ′ ≡ − b ( m o d c ) b'\equiv -b\pmod{c} bb(modc) ,故 n − b ′ ⋅ b ′ ≡ n − b 2 ( m o d c ) n-b'\cdot b'\equiv n-b^2\pmod{c} nbbnb2(modc) 。该值为正是显然的,因为 b ′ ≤ n b'\le\sqrt{n} bn
  • 利用数学归纳法, b = 0 ∧ c = 1 b=0\wedge c=1 b=0c=1 时显然成立。设 c ′ = ( n − b ′ ⋅ b ′ ) / c c'=(n-b'\cdot b')/c c=(nbb)/c ,则 ( n − b ′ ⋅ b ′ ) / c ′ = c ∈ Z (n-b'\cdot b')/c '=c\in\Z (nbb)/c=cZ ,故得证。

那么,这个连分数有多长呢?答案是,一定会出现循环。不难发现,如果 n + b c \frac{\sqrt{n}+b}{c} cn +b 在之前出现过,那么就循环了。我们的算法中, b ≤ n b\le\sqrt{n} bn ,而且该值 > 1 >1 >1 ,推出 2 n ≥ n + b > c 2\sqrt{n}\ge\sqrt{n}+b>c 2n n +b>c 。不同形式有限,鸽笼原理,必定有循环。

为了让整个过程更直观,令 k = ⌊ n ⌋ k=\lfloor\sqrt{n}\rfloor k=n ,再令 n x = n − x 2 n_x=n-x^2 nx=nx2 ,我们有

n = [ k ; k + i 1 n k , i 1 + i 2 n i 1 / n k , ⋯   , j 1 + i p , i + j 2 n i / p , ⋯   ] \sqrt{n}=\left[k;\frac{k+i_1}{n_k},\frac{i_1+i_2}{n_{i_1}/n_k},\cdots,\frac{j_1+i}{p},\frac{i+j_2}{n_i/p},\cdots\right] n =[k;nkk+i1,ni1/nki1+i2,,pj1+i,ni/pi+j2,]

现在我们来揭示这个连分数的一些规律,以其中的任意两项 j 1 + i p , i + j 2 n i / p \frac{j_1+i}{p},\frac{i+j_2}{n_i/p} pj1+i,ni/pi+j2 作代表。

  • 两个相邻的分母,乘积为共有的分子的过渡数 n i n_i ni

另外一个比较重要的结论是:

  • 由于该比值为正整数,所以 p ≤ j 1 + i ≤ k + i p\le j_1+i\le k+i pj1+ik+i ,也有 n i / p ≤ i + j 2 ≤ k + i n_i/p\le i+j_2\le k+i ni/pi+j2k+i
  • 由于 i i i 充分大,所以 p > k − i p>k-i p>ki ,否则 i i i 可以再增大 p p p
  • 注意到 n i > k 2 − i 2 = ( k − i ) ( k + i ) n_i>k^2-i^2=(k-i)(k+i) ni>k2i2=(ki)(k+i) ,故 n i p > ( k − i ) ( k + i ) k + i = k − i \frac{n_i}{p}>\frac{(k-i)(k+i)}{k+i}=k-i pni>k+i(ki)(k+i)=ki
  • 综上: p , n i p ∈ ( k − i , k + i ] p,\frac{n_i}{p}\in(k-i,k+i] p,pni(ki,k+i] 。换言之,两个相邻分母在 k k k 的邻域里,半径为共有因子。

然后我们可以证明,循环节从第二个开始。使用反证法。假设循环从 l l l 始,由 r r r 终。

n = [ … , b ′ + b l c ′ , b l + b l + 1 c l , … , b r + b l c r , b l + b l + 1 c l , …   ] \sqrt{n}=\left[\dots,\frac{b'+b_l}{c'},\frac{b_l+b_{l+1}}{c_l},\dots,\frac{b_r+b_l}{c_r},\frac{b_l+b_{l+1}}{c_l},\dots\right] n =[,cb+bl,clbl+bl+1,,crbr+bl,clbl+bl+1,]

由之前的结论, c ′ ⋅ c l = n − b l 2 c'\cdot c_l=n-b_l^2 ccl=nbl2 c r ⋅ c l = n 2 − b l 2 c_r\cdot c_l=n^2-b_l^2 crcl=n2bl2 ,所以 c ′ = c r c'=c_r c=cr

用上 c ′ = c r c'=c_r c=cr 的结论,由于 b ′ + b l c ′ \frac{b'+b_l}{c'} cb+bl b r + b l c r \frac{b_r+b_l}{c_r} crbr+bl 都是整数,所以 b ′ ≡ b r ( m o d c ′ ) b'\equiv b_r\pmod{c'} bbr(modc)

之前证明过了 k − b r < c ′ k-b_r<c' kbr<c k − b ′ < c ′ k-b'<c' kb<c 。在 b ′ = b r + c ′ b'=b_r+c' b=br+c (或者更大)时, b ′ > ( k − c ′ ) + c ′ = k b'>(k-c')+c'=k b>(kc)+c=k ,矛盾;在 b ′ = b r − c ′ b'=b_r-c' b=brc (或者更小)时, c ′ > k − ( b r − c ′ )    ⇔    k − b r < 0 c'>k-(b_r-c')\;\Leftrightarrow\;k-b_r<0 c>k(brc)kbr<0 不可能成立。

所以我们有了重要结论 { b ′ = b r c ′ = c r \begin{cases}b'=b_r\\c'=c_r\end{cases} {b=brc=cr

所以循环可以从 b ′ , c ′ b',c' b,c 开始,到 b r − 1 , c r − 1 b_{r-1},c_{r-1} br1,cr1 结束——循环整体向前推进一个。以此类推,循环节从第二个开始。

下证 循环节最后一位是 2 k 2k 2k 。首先证明,对于一项 i + j 1 \frac{i+j}{1} 1i+j ,如果其不为第一项(即 i = 0 i=0 i=0 的时候),那么 i = k i=k i=k 。这是因为 k − i < 1 k-i<1 ki<1 k − i ≤ 0    ⇔    k ≤ i k-i\le 0\;\Leftrightarrow\;k\le i ki0ki ,而 i ≤ k i\le k ik ,就只好 i = k i=k i=k 了。

考虑整个循环过程,一定形如

n = [ 0 + k 1 , k + b 1 n k / 1 , b 1 + b 2 n b 1 / n k , … , k + b 1 n k , …   ] \sqrt{n}=\left[\frac{0+k}{1},\frac{k+b_1}{n_k/1},\frac{b_1+b_2}{n_{b_1}/n_k},\dots,\frac{k+b_1}{n_k},\dots\right] n =[10+k,nk/1k+b1,nb1/nkb1+b2,,nkk+b1,]

显然 k + b 1 n k \frac{k+b_1}{n_k} nkk+b1 的上一个数的分母是 1 1 1 。故其分子是 k k k 。写完整就是

n = [ 0 + k 1 , k + b 1 n k , … , k + k 1 , k + b 1 n k , …   ] \sqrt{n}=\left[\frac{0+k}{1},\frac{k+b_1}{n_k},\dots,\frac{k+k}{1},\frac{k+b_1}{n_k},\dots\right] n =[10+k,nkk+b1,,1k+k,nkk+b1,]

明显循环的最后一位是 2 k 2k 2k ,得证。

3. P e l l Pell Pell 特解

n \sqrt{n} n 写成连分数,一定可以有递归形式

n = [ a 0 ; a 1 , a 2 , … , a k − 1 , a 0 + n ] \sqrt{n}=[a_0;a_1,a_2,\dots,a_{k-1},a_0+\sqrt{n}] n =[a0;a1,a2,,ak1,a0+n ]

设其渐进分数为 ⟨ p ⟩ / ⟨ q ⟩ \langle p\rangle/\langle q\rangle p/q ,则 n = p k − 1 ( a 0 + n ) + p k − 2 q k − 1 ( a 0 + n ) + q k − 2 \sqrt{n}=\frac{p_{k-1}(a_0+\sqrt{n})+p_{k-2}}{q_{k-1}(a_0+\sqrt{n})+q_{k-2}} n =qk1(a0+n )+qk2pk1(a0+n )+pk2

⇔    { n q k − 1 = a 0 p k − 1 + p k − 2 p k − 1 = a 0 q k − 1 + q k − 2 \Leftrightarrow\;\begin{cases}nq_{k-1}=a_0p_{k-1}+p_{k-2}\\ p_{k-1}=a_0q_{k-1}+q_{k-2}\end{cases} {nqk1=a0pk1+pk2pk1=a0qk1+qk2

这告诉我们, n q k − 1 p k − 1 = [ a 0 ; a 1 , a 2 , … , a k − 1 , a 0 ] \frac{nq_{k-1}}{p_{k-1}}=[a_0;a_1,a_2,\dots,a_{k-1},a_0] pk1nqk1=[a0;a1,a2,,ak1,a0]

2.4.4 中有结论 q k p k − 1 − p k q k − 1 = ( − 1 ) k q_kp_{k-1}-p_kq_{k-1}=(-1)^k qkpk1pkqk1=(1)k ,将 { q k = p k − 1 p k = n q k − 1 \begin{cases}q_k=p_{k-1}\\p_{k}=nq_{k-1}\end{cases} {qk=pk1pk=nqk1 代入得 p k − 1 2 − n q k − 1 2 = ( − 1 ) k p_{k-1}^2-nq_{k-1}^2=(-1)^k pk12nqk12=(1)k

k k k 为偶数时,显然 { x = p k − 1 y = q k − 1 \begin{cases}x=p_{k-1}\\y=q_{k-1}\end{cases} {x=pk1y=qk1 x 2 − n y 2 = 1 x^2-ny^2=1 x2ny2=1 的解。在 k k k 为奇数时,利用 智婕《 p e l l pell pell方程的求解技巧》 中介绍的方法,有 { x = 2 p k − 1 2 + 1 y = 2 p k − 1 q k − 1 \begin{cases}x=2p_{k-1}^2+1\\y=2p_{k-1}q_{k-1}\end{cases} {x=2pk12+1y=2pk1qk1 的解(直接暴力代入也可证明)。

该解是让 x + y n x+y\sqrt{n} x+yn 最小的解。

为什么是最小的解,我真的不知道了,找了好久了

4. P e l l Pell Pell k k k 小解

以下内容源于冯志刚《初等数论》

3 中我们给出了特解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 。令 ϵ = x 0 + y 0 n \epsilon=x_0+y_0\sqrt{n} ϵ=x0+y0n ,我们要说明,所有的解 x , y x,y x,y 满足

∴ ∃ n ∈ N + , s.t.    ϵ n = x + y n \therefore\exist n\in\N^+,\text{s.t.}\;\epsilon^n=x+y\sqrt{n} nN+,s.t.ϵn=x+yn

反证法。设令一解是 ( x , y ) (x,y) (x,y) ,一定

∃ n ∈ N + , s.t.    ϵ n < x + y n < ϵ n + 1 \exist n\in\N^{+},\text{s.t.}\;\epsilon^n<x+y\sqrt{n}<\epsilon^{n+1} nN+,s.t.ϵn<x+yn <ϵn+1

ϵ − 1 = x 0 − y 0 n \epsilon^{-1}=x_0-y_0\sqrt{n} ϵ1=x0y0n ,显然 ϵ − 1 ϵ = 1 \epsilon^{-1}\epsilon =1 ϵ1ϵ=1 。不等式同乘 ( ϵ − 1 ) n (\epsilon^{-1})^n (ϵ1)n 得到

1 < ( x + y n ) ( ϵ − 1 ) n < ϵ 1<(x+y\sqrt{n})(\epsilon^{-1})^n<\epsilon 1<(x+yn )(ϵ1)n<ϵ

( x + y n ) ( ϵ − 1 ) n = u + v n ( u ∈ Z , v ∈ Z ) (x+y\sqrt{n})(\epsilon^{-1})^n=u+v\sqrt{n}\quad(u\in\Z,v\in\Z) (x+yn )(ϵ1)n=u+vn (uZ,vZ) ,需要发现 ( u , v ) (u,v) (u,v) 是一组解。证明极其简单,由二项式展开可知 u − v n = ( x − y n ) ϵ n u-v\sqrt{n}=(x-y\sqrt{n})\epsilon^n uvn =(xyn )ϵn ,两式相乘可证。

此时,由于 1 < ( x + y n ) ( ϵ − 1 ) n = u + v n 1<(x+y\sqrt{n})(\epsilon^{-1})^n=u+v\sqrt{n} 1<(x+yn )(ϵ1)n=u+vn ,知

1 > 1 u + v n = u − v n > 0 1>\frac{1}{u+v\sqrt{n}}=u-v\sqrt{n}>0 1>u+vn 1=uvn >0

u + v n > 1 u+v\sqrt{n}>1 u+vn >1 相加,知 2 u > 1 2u>1 2u>1 ,即 u > 0 u>0 u>0 。又

2 v n = ( u + v n ) − ( u − v n ) > 1 − 1 = 0 2v\sqrt{n}=(u+v\sqrt{n})-(u-v\sqrt{n})>1-1=0 2vn =(u+vn )(uvn )>11=0

v > 0 v>0 v>0 。此时不难发现, ( u , v ) (u,v) (u,v) 是一组正整数解,但 u + v n < ϵ u+v\sqrt{n}<\epsilon u+vn <ϵ ,与 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 是最小解矛盾。

所以,第 k k k 小的解 ( x , y ) (x,y) (x,y) 满足 x + y n = ( x 0 + y 0 n ) k x+y\sqrt{n}=(x_0+y_0\sqrt{n})^k x+yn =(x0+y0n )k

5.例题

传送门 to VJ,直接是个板题。

#include <cstdio>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

typedef long long int_;
int_ a[20000];
bool pell(int_ n,int_ &x0,int_ &y0){
	int_ m = int_(sqrt(n)+0.5);
	while(m*m > n) -- m;
	while((m+1)*(m+1)<=n) ++ m;
	if(m*m == n) return false;
	int_ p = 0, q = 1; int i = 0;
	for(; true; ++i){
		int_ b = q-p;
		b += (m-b)/q*q;
		if((a[i] = (b+p)/q) == 2*m)
			break; // 循环终了
		p = b, q = (n-b*b)/q;
	}
	p = 1, q = 0; x0 = (i --);
	for(int_ t; i>=0; --i,q=t)
		t = p, p = q+a[i]*p;
	if((x0&1)^1) x0 = p, y0 = q;
	else x0 = 2*p*p+1, y0 = 2*p*q;
	return true;
}

int_ n; // sqrt{n}
const int mod = 8191;
struct Complex{
	int_ x, y;
	Complex(int_ R,int_ I){
		x = R%mod, y = I%mod;
	}
};
Complex operator*(Complex &a,Complex &b){
	return
	Complex(a.x*b.x%mod
	+n*a.y%mod*b.y%mod,
	a.x*b.y%mod
	+a.y*b.x%mod);
}

Complex qkpow(Complex base,int q){
	Complex ans = base; -- q;
	for(; q; q>>=1,base=base*base)
		if(q&1) ans = base*ans;
	return ans;
}

int main(){
	int_ k, x0, y0;
	while(~scanf("%lld %lld",&n,&k)){
		if(pell(n,x0,y0) == false){
			puts("No answers can \
meet such conditions");
			continue;
		}
		Complex c(x0,y0);
		c = qkpow(c,k);
		printf("%lld\n",c.x);
	}
	return 0;
}

6.其他资料

可能有用的博客

例题比较多的博客

感觉很奇怪的博客

专业,但是排版差劲的论文

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pell 方程是形如 $x^2-dy^2=1$ 的二元二次方程,其中 $d$ 是正整数,$x$ 和 $y$ 是正整数。求解 Pell 方程的一种经典方法是使用连分数。下面是求解 Pell 方程的步骤: 1. 首先,我们找到 Pell 方程的一个基本解 $(x_0,y_0)$,可以通过暴力枚举或使用其他方法来找到基本解。 2. 我们使用基本解 $(x_0,y_0)$ 来构造一个无限循环小数: $$\sqrt{d}=[a_0;\overline{a_1,a_2,\ldots,a_r,2a_0,\overline{a_1,a_2,\ldots,a_r,2a_0,\ldots}}]$$ 其中,$a_0=\lfloor\sqrt{d}\rfloor$,$a_i$ 是循环节中的数字。 3. 我们将这个无限循环小数表示为一个连分数: $$\sqrt{d}=a_0+\frac{1}{a_1+\frac{1}{a_2+\frac{1}{\ldots+\frac{1}{2a_0+\frac{1}{a_1+\frac{1}{a_2+\ldots}}}}}}$$ 4. 我们使用连分数的递归公式,计算出前 $n$ 个连分数的值: $$\begin{aligned}&h_0=a_0, &k_0=1 \\ &h_1=a_0a_1+1, &k_1=a_1 \\ &h_i=a_ih_{i-1}+h_{i-2}, &k_i=a_ik_{i-1}+k_{i-2}\end{aligned}$$ 其中,$h_i$ 和 $k_i$ 分别表示连分数的第 $i$ 个逼近分数的分子和分母。 5. 我们可以证明,对于任意 $n$,$(h_n,k_n)$ 都是 Pell 方程的解。这是由连分数的性质所决定的。 6. 最终,我们可以得到 Pell 方程的所有正整数解 $(x,y)$,它们可以通过 $(x,y)=(x_0h_n+dy_0k_n,x_0k_n+y_0h_n)$ 来计算。 需要注意的是,如果循环节长度为奇数,则最后一个连分数的分母应该是 $2a_0$,否则应该是 $1$。此外,如果循环节长度为 $0$,则 $a_1$ 应该等于 $2a_0$。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值