佩尔方程(Pell Equation)为:

其中d不为完全平方数且d>1.

如果已知它的最小特解:x1,y1

那么存在迭代公式:

通过简单的证明:

由此得到矩阵递推式:

暴力法寻找最小特解:

typedef long long LL;

void search(LL &x,LL &y,LL d){

y=1;

while(1>0){

x=(LL)sqrt(1+d*y*y);

if(x*x-d*y*y==1) break;

y++;

}

}

hdu 3292

No more tricks, Mr Nanguo http://acm.hdu.edu.cn/showproblem.php?pid=3292

大意:转化题意,即x^2-NY^2=1 求出第K个X解

分析:先暴力法求出特解,然后,Pell方程的解递推矩阵求出答案

#include

#include

#include

using namespace std;

const int mod=8191;

struct matrix{

int m[2][2];

}A;

matrix I={

1,0,

0,1

};

void get(int &x,int &y,int n){

for(y=1;;y++){

int sum=n*y*y+1;

x=(int)sqrt(sum);

if(x*x==sum) break;

}

}

matrix multi(matrix a,matrix b){

matrix ans;

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

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

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

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

ans.m[i][j]+=a.m[i][k]*b.m[k][j];

}

ans.m[i][j]%=mod;

}

}

return ans;

}

matrix power(int p){

matrix ans=I,temp=A;

while(p){

if(p&1) ans=multi(ans,temp);

temp=multi(temp,temp);

p>>=1;

}

return ans;

}

int main()

{

int n,k;

while(cin>>n>>k){

int nn=int(sqrt(n));

if(nn*nn==n) {

printf("No answers can meet such conditions\n");

continue;

}

int x,y;

get(x,y,n);

if(k==1){

printf("%d\n",x%mod);

continue;

}

A.m[0][0]=x%mod; A.m[0][1]=n*y%mod;

A.m[1][0]=y%mod; A.m[1][1]=x%mod;

A=power(k-1);

printf("%d\n",(A.m[0][0]*x%mod+A.m[0][1]*y%mod)%mod);

}

return 0;

}

连分数:

佩尔方程:  ,随着Y的增大,有关系:

因为d不是完全平方数,所以 可写成连分数的形式. 将该连分数表示成   称之为第n个渐进值。

存在:

POJ 2427

Smith's Problem

http://poj.org/problem?id=2427

大意:求解满足佩尔方程的一对值。数据很大。

连分数求解Pell方程,代码写不出来,参考他人。。

import java.math.BigInteger;

import java.util.Scanner;

public class Main

{

public static void solve(int n)

{

BigInteger N, p1, p2, q1, q2, a0, a1, a2, g1, g2, h1, h2,p,q;

g1 = q2 = p1 = BigInteger.ZERO;

h1 = q1 = p2 = BigInteger.ONE;

a0 = a1 = BigInteger.valueOf((int)Math.sqrt(1.0*n));

BigInteger ans=a0.multiply(a0);

if(ans.equals(BigInteger.valueOf(n)))

{

System.out.println("No solution!");

return;

}

N = BigInteger.valueOf(n);

while (true)

{

g2 = a1.multiply(h1).subtract(g1);

h2 = N.subtract(g2.pow(2)).divide(h1);

a2 = g2.add(a0).divide(h2);

p = a1.multiply(p2).add(p1);

q = a1.multiply(q2).add(q1);

if (p.pow(2).subtract(N.multiply(q.pow(2))).compareTo(BigInteger.ONE) == 0) break;

g1 = g2;

h1 = h2;

a1 = a2;

p1 = p2;

p2 = p;

q1 = q2;

q2 = q;

}

System.out.println(p+" "+q);

}

public static void main(String[] args)

{

Scanner cin = new Scanner(System.in);

while(cin.hasNextInt())

{

solve(cin.nextInt());

}

}

}

hdu 2281

Square Number

http://acm.hdu.edu.cn/showproblem.php?pid=2281

Find the biggest integer n (1 <= n <= N) and an integer x to make them satisfy

分析:关于平方数之和有一个公式,下面是推导,加深印象。

同时,

所以

所以,上面的等式就等价于:

import java.math.BigInteger;

import java.util.*;

public class Main

{

static BigInteger x,y;

public static void solve(long n)

{

BigInteger limit=BigInteger.valueOf(n);

BigInteger N, p1, p2, q1, q2, a0, a1, a2, g1, g2, h1, h2,p,q;

g1 = q2 = p1 = BigInteger.ZERO;

h1 = q1 = p2 = BigInteger.ONE;

a0 = a1 = BigInteger.valueOf((int)Math.sqrt(1.0*48));

N = BigInteger.valueOf(48);

while (true)

{

g2 = a1.multiply(h1).subtract(g1);

h2 = N.subtract(g2.pow(2)).divide(h1);

a2 = g2.add(a0).divide(h2);

p = a1.multiply(p2).add(p1);

q = a1.multiply(q2).add(q1);

if (p.pow(2).subtract(N.multiply(q.pow(2))).compareTo(BigInteger.ONE) == 0){

BigInteger t=p.subtract(BigInteger.valueOf(3)).divide(BigInteger.valueOf(4));

if(t.compareTo(limit)>0) break;

if(t.multiply(BigInteger.valueOf(4)).add(BigInteger.valueOf(3)).equals(p)){

x=t;

y=q;

}

}

g1 = g2;h1 = h2;a1 = a2;

p1 = p2;p2 = p;

q1 = q2;q2 = q;

}

}

public static void main(String[] args)

{

Scanner cin = new Scanner(System.in);

long val;

while(cin.hasNextLong())

{

val=cin.nextLong();

if(val==0) break;

x=BigInteger.ZERO;

y=BigInteger.ZERO;

solve(val);

System.out.println(x+" "+y);

}

}

}

c语言求佩尔方程的解,佩尔方程相关推荐

  1. 用C语言求一元二次方程的解

    一元二次方程ax^2+bx+c=0的求解有下列几种情况: 1.当a=0时,该方程不是一元二次方程的解. 2.当a≠0时,该方程是一元二次方程. (1)当b^2-4ac=0时,只有一个解: (2)当b^ ...

  2. C语言 求一元二次方程的解,考虑所有情况

    求一元二次方程的解,考虑所有情况 假设:ax²+bx+c=0 要求输入a,b,c的值,判断并求出方程的解. 有以下几种情况: 1.a = 0 (1)b = 0 c = 0时,x可以是任意数: c != ...

  3. c语言 求二元一次方程的解

    求二元一次方程的解 ax+by=cdx+ey=f输入格式:在一行中给出a.b.c.d.e.f的值,都为整数.输出格式:无数解,输出0 0:无解输出-1 -1:有解,输出x.y的解,保留两位小数. #i ...

  4. matlab riccati 方程,matlab解riccati方程

    Riccati 方程求解 ? ? 前三个问题将介绍解析解与数值解,后一 个属于非... 矩阵的化零空间或基础解系计算,支持符号运算 求解连续 Lyapunov 方程.Sylvester 方程的数值解 ...

  5. matlab求解复杂方程,MATLAB解复杂方程并求解

    MATLAB解复杂方程并求解0 现有三个等式,两个不等式(约束条件),想要求W/680的最小值,求助大神,应该怎么算呢?等式(三个)①(23086*Q1^2)/1000+(19648*Q9^2)/10 ...

  6. c语言求方程组的自然数解,多元一次线性方程自然数解的算法解决办法

    C/C++ code#include using namespace std; double* inverse_matrix(int determinant_scale, double *deter) ...

  7. 【C语言程序设计】C语言求最小公倍数(详解版)!

    问题描述 求任意两个正整数的最小公倍数(LCM). 问题分析 最小公倍数(Least Common Multiple,LCM),如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于 ...

  8. matlab求解拉普拉斯方程,急求用matlab编写解拉普拉斯方程的程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这么处理狄拉克边界条件,我的精确解和数值解的误差很大部只哪错了 附程序 % examp1a2.m clear all clc N=5;M=5;n=N*M; ...

  9. C语言求一元二次函数的解

    #include <stdio.h> #include <math.h> int main() { float a=0; float b=3;     float c=2; f ...

最新文章

  1. ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II
  2. mysql数据导库常用操作
  3. 数据挖掘介绍以及模型参数详解
  4. java db类_Java-jdbc-DBUtils工具类介绍
  5. client intended to send too large body
  6. SQL Server2008 表旋转(pivot)技术
  7. 点击底部input输入框,弹出的软键盘挡住input(苹果手机使用第三方输入法 )
  8. bootstrap-table toolbar图标换文字_iPhone 也能随意换字体啦~
  9. 安装sql server 2000
  10. 【Flink】Flink Heartbeat of TaskManager with id timed out.
  11. Linux的c编程getopt(分析命令行参数)
  12. pandas读取csv文件数据并对指定字段分类使用matplotlib在一张图里画四张折线图子图
  13. navicat 软件查询mysql表,限制显示条数
  14. arcgis-拓扑检查-model
  15. JavaScript中会打印出undefined的情况汇总
  16. [机房练习赛4.7] 深意 KMP
  17. Java基于局域网(LAN)的聊天室软件-内附源码
  18. java application_运行java application时,总是报错
  19. crmeb知识付费系统直播列表管理
  20. 我们都是代码接盘侠,请做一位好前任!

热门文章

  1. mysql安装问题:由于找不到MSVCR120.dIl,无法继续执行代码。
  2. 谈思生物直播课|辛格迪副总裁“细胞治疗数字化解决方案”
  3. c语言中v作用是什么意思,C语言里,\v是什么意思?
  4. docker+selenium+node-chrome-debug(node-firefox-debug)完成自动化测试环境的部署
  5. 关于内存条低压标压以及不同品牌容量内存条组建双通道笔记
  6. SANER 2018 论文阅读- Dissection of a Bug Dataset: Anatomy of 395 Patches from Defects4J
  7. matlab画光顺曲线,曲线曲面
  8. 数字 IC 技能拓展(16)Zynq 与 Pynq 都是什么呢
  9. 银河麒麟系统使用方法
  10. 【无标题】大一学生HTML5期末大作业——基于HTML+CSS制作女装商城 6页