佩尔方程讲解连接:

若一个丢番图方程具有以下的形式:

为正整数,则称此方程为佩尔方程(英文:Pell's equation 德文:Pellsche Gleichung)

是完全平方数,则这个方程式只有解

(实际上对任意的

都是解)。对于其余情况,拉格朗日证明了佩尔方程总有解。而这些解可由

的连分数求出。

 是

的连分数表示:

的渐近分数列,由连分数理论知存在

 使得(pi,qi) 为佩尔方程的解。取其中最小的

,将对应的 (pi,qi) 称为佩尔方程的基本解,或最小解,记作(x1,y1) ,则所有的解(xi,yi) 可表示成如下形式:

或者由以下递推公式得到:

——————————————————分割线————————————————————

求得佩尔方程最小正整数解后,由公式

可求得第k解(X1,Y1为最小正整数解)。

到这里你可能会想用递归的方法求解Xk及Yk。可是事实上如果k的值很大的话,就会花费好多时间。所以在这里求解的时候,用矩阵快速幂便可节约很多时间。

现在构造矩阵,如下图

swun oj 里的一题,请参考,以便理解

#include

#include

#include

using namespace std;

typedef __int64 ll;

#define Mod 1000000007

ll x,y,n,k;

struct PellAns

{

ll p,q;

};

struct Node

{

ll g,h;

};

struct Matrix

{

ll a[2][2];

void init()

{

a[0][0]=x%Mod;a[0][1]=y%Mod;

a[1][0]=(n%Mod*y%Mod%Mod)%Mod;a[1][1]=x%Mod;

}

};

//矩阵乘法

Matrix matrix_mul(Matrix a,Matrix b)

{

ll i,j,k;

Matrix ans;

for(i=0;i<2;i++)

{

for(j=0;j<2;j++)

{

ans.a[i][j]=0;

for(k=0;k<2;k++)

ans.a[i][j]=(ans.a[i][j]%Mod+(a.a[i][k]%Mod*b.a[k][j]%Mod)%Mod)%Mod;

}

}

return ans;

}

//矩阵快速幂

Matrix mult(Matrix a,ll b)

{

Matrix ans;

ans.a[0][0]=1;ans.a[0][1]=0;

ans.a[1][0]=0;ans.a[1][1]=1;

while(b)

{

if(b & 1)

ans=matrix_mul(ans,a);

b>>=1;

//cout<

a=matrix_mul(a,a);

}

return ans;

}

//求佩尔方程最小正整数解...模板

PellAns Solve( ll n1)

{

PellAns s[4];

Node w[4];

int a[4];

s[0].p=0; s[0].q=1;

s[1].p=1; s[1].q=0;

a[0]=(ll)floor(sqrt( (double)n ));

a[2]=a[0];

w[1].g=0;w[1].h=1;

while( 1 )

{

w[2].g = -w[1].g+a[2]*w[1].h;

w[2].h = (n1-w[2].g*w[2].g)/w[1].h;

a[3] = (ll)floor( (double)(w[2].g+a[0])/w[2].h );

s[2].p = a[2]*s[1].p+s[0].p;

s[2].q = a[2]*s[1].q+s[0].q;

if( (s[2].p*s[2].p-n1*s[2].q*s[2].q) == 1 &&s[2].p>0&&s[2].q>0 )

return s[2];

w[0]=w[1];w[1]=w[2];

a[2]=a[3];

s[0]=s[1];s[1]=s[2];

}

}

int main()

{

PellAns ans;

// freopen("a.in","r",stdin);

//freopen("1.out","w",stdout);

while( ~scanf("%I64d%I64d",&n,&k) )

{

if(sqrt(double(n))*sqrt(double(n))==n) {

printf("No solution\n");continue;

}

ans = Solve(n);//求得佩尔方程最小正整数解

x=ans.p%Mod,y=ans.q%Mod;

Matrix tmp,ans1;

tmp.init(); //初始化

ans1=mult(tmp,(k-1)%Mod);

ll x1=x%Mod;

x=((ans1.a[0][0]%Mod*x%Mod)%Mod+(ans1.a[1][0]%Mod*y%Mod)%Mod)%Mod;

y=((ans1.a[0][1]%Mod*x1%Mod)+(ans1.a[1][1]%Mod*y%Mod)%Mod)%Mod;

printf("%I64d,%I64d %I64d,%I64d\n",ans.p,ans.q,x%Mod,y%Mod);

}

return 0;

}

c语言求佩尔方程的解设计思路,c语言版 佩尔方程求最小正整数解及第k解(矩阵快速幂)...相关推荐

  1. 蓝桥杯 算法提高 递推求值(矩阵快速幂)详解

    传送门 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3 ...

  2. 佩尔(Pell)方程最小正整数解

    佩尔方程最小正整数解

  3. 关于扩展欧几里得求最小正整数解

    关于扩展欧几里得求最小正整数解 //扩展欧几里得算法求最小正整数解 这里讲的是欧几里得,不是那个洗澡测浮力的阿基米德 . 什么是欧几里得算法: 扩展欧几里得算法是用来求解一类特定的不定方程的,形如ax ...

  4. C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

    众所周知,斐波那契数列是非常经典的一个数列,它的数学公式如下 为了便于观察,我们列出它的几项:0  1  1  2  3  5  8  13  21...... 下面我们将介绍四种方法来用C语言计算机 ...

  5. (详解)矩阵快速幂详解与常见转移矩阵的构造

    目录 转移矩阵求解套路 常见转移矩阵1-斐波那契矩阵 承接套路 常见转移矩阵2-类斐波那契数列 常见转移矩阵3-幂常数 前缀和 具体DP问题 ----------------------------- ...

  6. 2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂

    题意:有若干字符,现在要把它们连成一个字符串,每种字符后面只能接特定种类的字符,现在询问能连接出的长度小于等于m的字符串有多少种. 思路:我们可以把这个转移关系看成一个图,如果字符a后面可以接b,那么 ...

  7. NYOJ 301 递推求值(矩阵快速幂)

    递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n ...

  8. (矩阵快速幂)解所有类似Fibonacci 的题目

    Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...

  9. 2017.3.25 矩阵快速幂 求斐波那契数列第n项

    对于矩阵快速幂只要知道矩阵取模.乘法原理就完全可以手推 口诀:行 列         被计算的行列的交点是结果对应的位置: 剩下的就是推矩阵: 其实根据矩阵的方程意义就很好推了: 码: #includ ...

最新文章

  1. PAT(甲级)2021年春季考试 7-4 Recycling of Shared Bicycles
  2. java用户输入解析_Java中的3种输入方式实现解析
  3. Android Zxing 加入闪光灯功能
  4. btc勒索病毒文件恢复及数据库恢复方案
  5. 数据库分区分表以及读写分离
  6. sas中的sql(2) 行选择 、限制重复、条件运算符、运行前语法检查、feedback、count...
  7. centos7.2安装mysql5.7_Centos7.2下使用YUM快速安装MySQL5.7的方法
  8. 《剑指offer》丑数
  9. Win7 x64 PL/SQL 连接 Oralce 提示 Could not initialize %ORACLE_HOME%\bin\oci.dll
  10. Linux系统的启动过程(转)
  11. 运行程序中的服务器错误是什么,登陆一个网站时,出现“/”应用程序中的服务器错误要怎么解决啊?? 爱问知识人...
  12. drool 7.x 属性 : agenda-group
  13. [error]:启用sqlserver配置管理器异常,内存不足
  14. tensorflow 变量共享
  15. DataWhale-动手数据分析-Task01:数据加载及探索性数据分析
  16. 十张图,看数据分析如何赋能销售
  17. c++ 简单的求面积:圆的面积,正方形的面积,长方形的面积
  18. 【笑小枫的按步照搬系列】Git从安装到入门操作,一文搞定
  19. jQuery---动画
  20. 查询选修相同课程的学生学号、课程号和成绩

热门文章

  1. 【渝粤教育】国家开放大学2018年春季 0579-22T电路及磁路(2)(一) 参考试题
  2. 【渝粤教育】21秋期末考试混凝土结构10515k1
  3. [渝粤教育] 中国地质大学 结构力学 复习题
  4. 【渝粤题库】陕西师范大学210004幼儿园美术教育作业(高起专)
  5. c语言文件指针ab命令,C语言试题,~库(完整版~).doc
  6. 2mysql_2.Mysql常用命令行大全
  7. Robbers' watch CodeForces - 685A (暴力)
  8. Github pull request 工作流总结
  9. LoadRunner脚本增强技巧之检查点
  10. Java 实现常见排序算法