大家好,欢迎来到IT知识分享网。
文章目录
说明:
文中的分数 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,q∈Z 。
由于结论是需要证明的,所以结论用 ∴ \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) x2−ny2=1(n∈Z,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 x2−t2=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) ∴x2−ny2=1(x,y,n∈N+,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(k≥2) ,我们有
∴ { 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=akpk−1+pk−2qk=akqk−1+qk−2
该定理可以使用数学归纳法证明。在 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’} q′p′ ,由归纳法有
{ 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′=akpk−1′+pk−2′qk′=akqk−1′+qk−2′
而 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′+qk′qk=pk′
将角标换成 k − 1 k-1 k−1 或 k − 2 k-2 k−2 自然也成立。进一步推导有
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(akpk−1′+pk−2′)+(akqk−1′+qk−2′)=ak(a0pk−1′+qk−1′)+(a0pk−2′+qk−2′)=akpk−1+pk−2
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} {
p−1=1q−1=0,{
p−2=0q−2=1
这会使得 2.3.2
对于任意 k ∈ N k\in\N k∈N 都成立。
4.重要结论
将 2.3.2
中的公式,上式乘 q k − 1 q_{k-1} qk−1 得到
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} pkqk−1=akpk−1qk−1+pk−2qk−1(1)
下式乘 p k − 1 p_{k-1} pk−1 得到
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} qkpk−1=akqk−1pk−1+qk−2pk−1(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}) qkpk−1−pkqk−1=−(qk−1pk−2−pk−1qk−2)
左右两边的形式是相仿的,我们可以定义新数列 { q n p n − 1 − p n q n − 1 } \{q_{n}p_{n-1}-p_{n}q_{n-1}\} {
qnpn−1−pnqn−1} ,结合首项 q 0 p − 1 − p 0 q − 1 = 1 q_0p_{-1}-p_{0}q_{-1}=1 q0p−1−p0q−1=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 ∴qkpk−1−pkqk−1=(−1)k
4.逼近无理数
杨中和《二次无理数的连分数》讲的非常清楚,严谨。果然还是要看专业文献。
设我们正在展开 n + b c \frac{\sqrt{n}+b}{c} cn+b ,满足 b ∈ Z , c ∈ N + b\in\Z,c\in\N^+ b∈Z,c∈N+ 。不妨设其值为 a + 1 r a+\frac{1}{r} a+r1 ,其中 a ∈ Z a\in\Z a∈Z ,而 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’) maximizeb′≤n,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+b′r=(n−b′⋅b′)/cn+b′
r r r 是化简后的结果。分母有理化就不在这里进行了。下证 n − b ′ ⋅ b ′ c ∈ N + \frac{n-b’\cdot b’}{c}\in\N^+ cn−b′⋅b′∈N+ 。
- 注意到 b ′ ≡ − b ( m o d c ) b’\equiv -b\pmod{c} b′≡−b(modc) ,故 n − b ′ ⋅ b ′ ≡ n − b 2 ( m o d c ) n-b’\cdot b’\equiv n-b^2\pmod{c} n−b′⋅b′≡n−b2(modc) 。该值为正是显然的,因为 b ′ ≤ n b’\le\sqrt{n} b′≤n 。
- 利用数学归纳法, b = 0 ∧ c = 1 b=0\wedge c=1 b=0∧c=1 时显然成立。设 c ′ = ( n − b ′ ⋅ b ′ ) / c c’=(n-b’\cdot b’)/c c′=(n−b′⋅b′)/c ,则 ( n − b ′ ⋅ b ′ ) / c ′ = c ∈ Z (n-b’\cdot b’)/c ‘=c\in\Z (n−b′⋅b′)/c′=c∈Z ,故得证。
那么,这个连分数有多长呢?答案是,一定会出现循环。不难发现,如果 n + b c \frac{\sqrt{n}+b}{c} cn+b 在之前出现过,那么就循环了。我们的算法中, b ≤ n b\le\sqrt{n} b≤n ,而且该值 > 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=n−x2 ,我们有
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 p≤j1+i≤k+i ,也有 n i / p ≤ i + j 2 ≤ k + i n_i/p\le i+j_2\le k+i ni/p≤i+j2≤k+i 。
- 由于 i i i 充分大,所以 p > k − i p>k-i p>k−i ,否则 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>k2−i2=(k−i)(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(k−i)(k+i)=k−i 。
- 综上: p , n i p ∈ ( k − i , k + i ] p,\frac{n_i}{p}\in(k-i,k+i] p,pni∈(k−i,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=[…,c′b′+bl,clbl+bl+1,…,crbr+bl,clbl+bl+1,…]
由之前的结论, c ′ ⋅ c l = n − b l 2 c’\cdot c_l=n-b_l^2 c′⋅cl=n−bl2 且 c r ⋅ c l = n 2 − b l 2 c_r\cdot c_l=n^2-b_l^2 cr⋅cl=n2−bl2 ,所以 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’} c′b′+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’} b′≡br(modc′) 。
之前证明过了 k − b r < c ′ k-b_r<c’ k−br<c′ 与 k − b ′ < c ′ k-b'<c’ k−b′<c′ 。在 b ′ = b r + c ′ b’=b_r+c’ b′=br+c′ (或者更大)时, b ′ > ( k − c ′ ) + c ′ = k b’>(k-c’)+c’=k b′>(k−c′)+c′=k ,矛盾;在 b ′ = b r − c ′ b’=b_r-c’ b′=br−c′ (或者更小)时, c ′ > k − ( b r − c ′ ) ⇔ k − b r < 0 c’>k-(b_r-c’)\;\Leftrightarrow\;k-b_r<0 c′>k−(br−c′)⇔k−br<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} br−1,cr−1 结束——循环整体向前推进一个。以此类推,循环节从第二个开始。
下证 循环节最后一位是 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 k−i<1 即 k − i ≤ 0 ⇔ k ≤ i k-i\le 0\;\Leftrightarrow\;k\le i k−i≤0⇔k≤i ,而 i ≤ k i\le k i≤k ,就只好 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,…,ak−1,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=qk−1(a0+n)+qk−2pk−1(a0+n)+pk−2
⇔ { 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} ⇔{
nqk−1=a0pk−1+pk−2pk−1=a0qk−1+qk−2
这告诉我们, 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] pk−1nqk−1=[a0;a1,a2,…,ak−1,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 qkpk−1−pkqk−1=(−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=pk−1pk=nqk−1 代入得 p k − 1 2 − n q k − 1 2 = ( − 1 ) k p_{k-1}^2-nq_{k-1}^2=(-1)^k pk−12−nqk−12=(−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=pk−1y=qk−1 是 x 2 − n y 2 = 1 x^2-ny^2=1 x2−ny2=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=2pk−12+1y=2pk−1qk−1 的解(直接暴力代入也可证明)。
该解是让 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} ∴∃n∈N+,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} ∃n∈N+,s.t.ϵn<x+yn<ϵn+1
令 ϵ − 1 = x 0 − y 0 n \epsilon^{-1}=x_0-y_0\sqrt{n} ϵ−1=x0−y0n ,显然 ϵ − 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(u∈Z,v∈Z) ,需要发现 ( u , v ) (u,v) (u,v) 是一组解。证明极其简单,由二项式展开可知 u − v n = ( x − y n ) ϵ n u-v\sqrt{n}=(x-y\sqrt{n})\epsilon^n u−vn=(x−yn)ϵ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+vn1=u−vn>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)−(u−vn)>1−1=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.其他资料
可能有用的博客。
例题比较多的博客。
感觉很奇怪的博客。
专业,但是排版差劲的论文。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/157368.html