佩尔方程及其在一类二元二次丢番图方程的推广
文章目录
- 前言
- 标准型佩尔方程
- 性质
- 求最小解
- 暴力写法
- 连分数写法
- 例题
- 非标准型佩尔方程
- 额外证明
- 求解没有xy项的二元二次丢番图方程
- 例题
- 后记
前言
这是一篇欠了半年多的博客,期间笔者遇到了诸多类似问题,故决定做出总结性结论。
标准型佩尔方程
形如x2−Dy2=1(D>0)x^2-Dy^2=1(D>0)x2−Dy2=1(D>0)的方程,即为标准型佩尔方程。
性质
1.容易得到,{x=±1y=0\begin{cases}x=\pm1\\y=0\end{cases}{x=±1y=0必是该方程的解。
若DDD为平方数,则只有这种解,反之则有无数多组解。
证明略,见百度百科。
2.若一组解(x1,y1)(x_1,y_1)(x1,y1)是非(±1,0)(\pm1,0)(±1,0)的最小正整数解(即DDD为非平方数),则{xn=xn−1x1+Dyn−1y1yn=xn−1y1+yn−1x1\begin{cases}x_n=x_{n-1}x_1+Dy_{n-1}y_1\\y_n=x_{n-1}y_1+y_{n-1}x_1\end{cases}{xn=xn−1x1+Dyn−1y1yn=xn−1y1+yn−1x1
或者可以写成xn+Dyn=(x1+Dy1)nx_n+\sqrt{D}y_n=(x_1+\sqrt{D}y_1)^{n}xn+Dyn=(x1+Dy1)n
或者写成
xn=(x1+Dy1)n+(x1−Dy1)n2x_n=\frac{(x_1+\sqrt{D}y_1)^n+(x_1-\sqrt{D}y_1)^n}{2}xn=2(x1+Dy1)n+(x1−Dy1)n
yn=(x1+Dy1)n−(x1−Dy1)n2Dy_n=\frac{(x_1+\sqrt{D}y_1)^n-(x_1-\sqrt{D}y_1)^n}{2\sqrt{D}}yn=2D(x1+Dy1)n−(x1−Dy1)n
该式子可以表示为(xnyn)=(x1Dy1y1x1)n−1(x1y1)\begin{pmatrix} x_n \\ y_n\end{pmatrix}=\begin{pmatrix} x_1 & Dy_1\\ y_1 & x_1\end{pmatrix}^{n-1}\begin{pmatrix} x_1 \\ y_1\end{pmatrix}(xnyn)=(x1y1Dy1x1)n−1(x1y1)的矩阵形式,因此可以利用矩阵快速幂求出第nnn大的解。
证明略,见佩尔方程维基百科
求最小解
在DDD不为平方数的情况下,如何解出(x1,y1)(x_1,y_1)(x1,y1)成为了解决问题最关键的地方。
当然,在DDD不大的情况下,我们显然可以暴力求解。
暴力写法
void pell(int &a,int &b,int d)//暴力寻找pell方程最小解
{b=1;while(true){a=(LL)sqrt(d*b*b+1);if(a*a-d*b*b==1)break;b++;}
}
显然在很多时候,这种方法太慢了,而且对于某些问题上,x1x_1x1,y1y_1y1可能很大,为此,我们引入连分数。
连分数写法
连分数的相关性质与定理参考可以看这里
对于连分数a0+1a1+1a2+...=pqa_0+\frac{1}{a_1+\frac{1}{a_2+...}}=\frac{p}{q}a0+a1+a2+...11=qp,我们将其记作[a0;a1,a2,...]=pq[a_0;a_1,a_2,...]=\frac{p}{q}[a0;a1,a2,...]=qp
我们记算sqrt(D)sqrt(D)sqrt(D)的渐进连分式hk\frac{h}{k}kh,并将h2−Dk2h^2-Dk^2h2−Dk2代入验证,直到h2−Dk2=1h^2-Dk^2=1h2−Dk2=1
例如,我们计算x2−7x2=1x^2-7x^2=1x2−7x2=1
(7)=2.64575=2+0.64575,10.64575=1.54858\sqrt(7)=2.64575=2+0.64575,\frac{1}{0.64575}=1.54858(7)=2.64575=2+0.64575,0.645751=1.54858,取整数部分2,得到21\frac{2}{1}12,代入发现不是解
1.54858=1+0.54858,10.54858=1.822881.54858=1+0.54858,\frac{1}{0.54858}=1.822881.54858=1+0.54858,0.548581=1.82288,取整数1,得到2+11=312+\frac{1}{1}=\frac{3}{1}2+11=13,代入发现不是解
1.82288=1+0.82288,10.82288=1.215241.82288=1+0.82288,\frac{1}{0.82288}=1.215241.82288=1+0.82288,0.822881=1.21524,取整数1,得到2+11+11=522+\frac{1}{1+\frac{1}{1}}=\frac{5}{2}2+1+111=25,代入发现不是解
1.21524=1+0.21524,10.21524=4.645971.21524=1+0.21524,\frac{1}{0.21524}=4.645971.21524=1+0.21524,0.215241=4.64597,取整数1,得到2+11+11+11=832+\frac{1}{1+\frac{1}{1+\frac{1}{1}}}=\frac{8}{3}2+1+1+1111=38,代入发现是解。
故最小正整数解为(8,3)(8,3)(8,3)
(代码待补充,咕咕咕)
例题
我们定义三条边是连续正整数t−1,t,t+1t-1,t,t+1t−1,t,t+1,且面积也是正整数的三角形为“G三角形”,
给定一个数nnn,求出t<=n(1≤n≤1e18)t<=n(1\leq n \leq 1e18)t<=n(1≤n≤1e18)的所有的满足条件的三角形个数
注意到xnx_nxn是一阶线性递推式,呈指数级增长,因此只需要事前打表即可。代码略。
非标准型佩尔方程
对于方程x2−Dy2=k(D>0)x^2-Dy^2=k(D>0)x2−Dy2=k(D>0)
1.先找到第一组解(暴力或者连分数),记为(x0,y0)(x_0,y_0)(x0,y0)
2.定义标准型佩尔方程r2−Ds2=1r^2-Ds^2=1r2−Ds2=1
3.利用婆罗摩笈多恒等式得到
k=k∗1=(x02−Dy02)(r2−Ds2)=(x0r+Dy0s)2−D(x0s+y0r)2k=k*1=(x_{0}^{2}-Dy_0^2)(r^2-Ds^2)=(x_0r+Dy_0s)^2-D(x_0s+y_0r)^2k=k∗1=(x02−Dy02)(r2−Ds2)=(x0r+Dy0s)2−D(x0s+y0r)2
即x=x0r+Dy0s,y=x0s+y0rx=x_0r+Dy_0s,y=x_0s+y_0rx=x0r+Dy0s,y=x0s+y0r
而r,sr,sr,s可以利用标准型求解,从而得到x,yx,yx,y的解。
额外证明
事实上,(x02−Dy02)(r2−Ds2)=(x0r±Dy0s)2−D(x0s±y0r)2(x_{0}^{2}-Dy_0^2)(r^2-Ds^2)=(x_0r\pm Dy_0s)^2-D(x_0s\pm y_0r)^2(x02−Dy02)(r2−Ds2)=(x0r±Dy0s)2−D(x0s±y0r)2,证明略。
为什么只选择了加号?接下来讨论x0r−Dy0sx_0r-Dy_0sx0r−Dy0s的符号的不确定性。
对于f(s)=x0r−Dy0s=x01+Ds2−Dy0sf(s)=x_0r-Dy_0s=x_0\sqrt{1+Ds^2}-Dy_0sf(s)=x0r−Dy0s=x01+Ds2−Dy0s
f′(s)=122x0Ds1+Ds2−Dy0f'(s)=\frac{1}{2}\frac{2x_0Ds}{\sqrt{1+Ds^2}}-Dy_0f′(s)=211+Ds22x0Ds−Dy0
=x0Ds1+Ds2−Dy0≤x0−Dy0=\frac{x_0Ds}{\sqrt{1+Ds^2}}-Dy_0\leq x_0-Dy_0=1+Ds2x0Ds−Dy0≤x0−Dy0
因为x0−Dy0x_0-Dy_0x0−Dy0与x2−Dy2x^2-Dy^2x2−Dy2,也就是kkk的符号相同,讨论符号后,计算f(s)>0f(s)>0f(s)>0的区间,这部分也是解!
部分题目中为了方便,通常让k<0k<0k<0,且f′(s)<0f'(s)<0f′(s)<0或最小的正整数解(r0,s0)(r_0,s_0)(r0,s0)代入f(s)f(s)f(s)也是负数,即该部分无解!
x0s±y0rx_0s\pm y_0rx0s±y0r略,证明同理。
求解没有xy项的二元二次丢番图方程
对于没有xy项的二元二次丢番图方程Ax2+Bx+Cy2+Dy+E=0Ax^2+Bx+Cy^2+Dy+E=0Ax2+Bx+Cy2+Dy+E=0
我们配方后得到类似如下的式子x2+Dy2=Ex^2+Dy^2=Ex2+Dy2=E
之后再用推广佩尔方程求解即可。
这里贴一个我以前遇到过的题目。
例题
对于正整数m,nm,nm,n,满足2m(m+1)=n(n+1)2m(m+1)=n(n+1)2m(m+1)=n(n+1),求不大于l(1≤l≤1e18)l(1\leq l \leq 1e18)l(1≤l≤1e18)的最大的nnn。
得到nnn的递推式之后,不难发现二阶线性递推式的增长呈指数爆炸,因此只需要快速打表出前若干个即可。代码略。
后记
佩尔方程是个冷门,但一旦考察时很灵活的类型,希望各位读者可以掌握。
对于部分包含xyxyxy项的二元二次丢番图方程,可以先用一些特殊方法配方为不包含改项的式子,具体以后有精力再来展开讨论。
DrGilbert 2021.4.19
upd:2021.7.7:修复部分描述问题
佩尔方程及其在一类二元二次丢番图方程的推广相关推荐
- 数论笔记 · 佩尔方程
转载自:http://blog.sina.com.cn/s/blog_5d06e2390100ll92.html 佩尔方程实际上并不是佩尔提出的,而是费尔马提出,却被欧拉误记为佩尔提出,因此佩尔方程的 ...
- 数论笔记 · 佩尔方程(连分数)
http://blog.sina.com.cn/s/blog_5d06e2390100ll92.html 佩尔方程实际上并不是佩尔提出的,而是费尔马提出,却被欧拉误记为佩尔提出,因此佩尔方程的名称沿用 ...
- C语言之基本算法26—佩尔方程求解
//穷举法! /* ====================================================== 题目:求佩尔方程x*x-73*y*y=1的解. =========== ...
- 求解佩尔方程的基本解
佩尔方程是关于x,y的二元不定式方程,表述为:x*x-n*y*y=1;(n为非平方整数) 当x=1或x=-1,y=0显然满足方程.常把x,y为满足方程的最小正数的解又称基本解. #include< ...
- 【枚举算法】佩尔方程
佩尔方程是关于x.y的二次不定方程,表述为: x^2 - ny^2 = 1 (n为非平方正整数) 当x = 1或-1,y = 0时,满足方程.常把x.y中有一个零的解称为平凡解. 佩尔方程的非平凡解 ...
- POJ 1320 Street Numbers 解佩尔方程
传送门 Street Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2529 Accepted: 140 ...
- c语言求佩尔方程的解设计思路,c语言版 佩尔方程求最小正整数解及第k解(矩阵快速幂)...
佩尔方程讲解连接: 若一个丢番图方程具有以下的形式: 且 为正整数,则称此方程为佩尔方程(英文:Pell's equation 德文:Pellsche Gleichung) 若 是完全平方数,则这个方 ...
- 数论 —— 佩尔方程与连分数
[概述] 连分数是一种特殊的繁分数,其形式为: ,通常记为:,其中 和 称为连分数多项式,对于任意的 a 均为一次式,它们的比值称为第 n 个渐进值渐进分数. 佩尔(Pell)方程是一种不定二次 ...
- 佩尔方程(超详细推导+例题讲解) 每日一遍,算法再见!
这里写目录标题 佩尔方程 第一类佩尔方程 第一类佩尔方程例题讲解 第二类佩尔方程 佩尔方程 第一类佩尔方程 定义:形如x2−dy2=1x^2 - dy^2 = 1x2−dy2=1(d>1,且d不 ...
最新文章
- 假期怎么提升Python技能?100+编程题给你练~
- Linux下关闭和开启IPv6的方法
- 关系型数据库、非关系型数据库
- 验证中文的正则表达式
- 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.2 内存...
- undertow ssl_SSL与WildFly 8和Undertow
- java 子类继承父类_关于Java 的继承问题,子类会继承父类的哪些东西?-----转载...
- LeetCode : Number of Segments in a String
- 【Level 08】U06 Good Feeling L3 Fun-filled concert
- .net面试题及答案(一)(转)
- 活久见!巴菲特被诈骗50亿,股神真的糊涂了?
- 两个员工,一个做事认真但效率低,一个迟到早退但效率高,只能留一个我该留哪个?
- timequest静态时序分析学习笔记之命令约束
- linux下mysql允许远程连接
- VSTO之一:Word外接程序
- 再见 Wordpress!这个开源建站神器有点吊
- 恕我直言,Java四大名著并不一定适合你!
- 数据分析——1.环境搭建(Jupyter Lab安装教程)
- jieba中文分词组件
- CSS实现元素翻转效果