c语言求佩尔方程的解,佩尔方程
佩尔方程(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语言求佩尔方程的解,佩尔方程相关推荐
- 用C语言求一元二次方程的解
一元二次方程ax^2+bx+c=0的求解有下列几种情况: 1.当a=0时,该方程不是一元二次方程的解. 2.当a≠0时,该方程是一元二次方程. (1)当b^2-4ac=0时,只有一个解: (2)当b^ ...
- C语言 求一元二次方程的解,考虑所有情况
求一元二次方程的解,考虑所有情况 假设:ax²+bx+c=0 要求输入a,b,c的值,判断并求出方程的解. 有以下几种情况: 1.a = 0 (1)b = 0 c = 0时,x可以是任意数: c != ...
- c语言 求二元一次方程的解
求二元一次方程的解 ax+by=cdx+ey=f输入格式:在一行中给出a.b.c.d.e.f的值,都为整数.输出格式:无数解,输出0 0:无解输出-1 -1:有解,输出x.y的解,保留两位小数. #i ...
- matlab riccati 方程,matlab解riccati方程
Riccati 方程求解 ? ? 前三个问题将介绍解析解与数值解,后一 个属于非... 矩阵的化零空间或基础解系计算,支持符号运算 求解连续 Lyapunov 方程.Sylvester 方程的数值解 ...
- matlab求解复杂方程,MATLAB解复杂方程并求解
MATLAB解复杂方程并求解0 现有三个等式,两个不等式(约束条件),想要求W/680的最小值,求助大神,应该怎么算呢?等式(三个)①(23086*Q1^2)/1000+(19648*Q9^2)/10 ...
- c语言求方程组的自然数解,多元一次线性方程自然数解的算法解决办法
C/C++ code#include using namespace std; double* inverse_matrix(int determinant_scale, double *deter) ...
- 【C语言程序设计】C语言求最小公倍数(详解版)!
问题描述 求任意两个正整数的最小公倍数(LCM). 问题分析 最小公倍数(Least Common Multiple,LCM),如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于 ...
- matlab求解拉普拉斯方程,急求用matlab编写解拉普拉斯方程的程序
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这么处理狄拉克边界条件,我的精确解和数值解的误差很大部只哪错了 附程序 % examp1a2.m clear all clc N=5;M=5;n=N*M; ...
- C语言求一元二次函数的解
#include <stdio.h> #include <math.h> int main() { float a=0; float b=3; float c=2; f ...
最新文章
- ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II
- mysql数据导库常用操作
- 数据挖掘介绍以及模型参数详解
- java db类_Java-jdbc-DBUtils工具类介绍
- client intended to send too large body
- SQL Server2008 表旋转(pivot)技术
- 点击底部input输入框,弹出的软键盘挡住input(苹果手机使用第三方输入法 )
- bootstrap-table toolbar图标换文字_iPhone 也能随意换字体啦~
- 安装sql server 2000
- 【Flink】Flink Heartbeat of TaskManager with id timed out.
- Linux的c编程getopt(分析命令行参数)
- pandas读取csv文件数据并对指定字段分类使用matplotlib在一张图里画四张折线图子图
- navicat 软件查询mysql表,限制显示条数
- arcgis-拓扑检查-model
- JavaScript中会打印出undefined的情况汇总
- [机房练习赛4.7] 深意 KMP
- Java基于局域网(LAN)的聊天室软件-内附源码
- java application_运行java application时,总是报错
- crmeb知识付费系统直播列表管理
- 我们都是代码接盘侠,请做一位好前任!
热门文章
- mysql安装问题:由于找不到MSVCR120.dIl,无法继续执行代码。
- 谈思生物直播课|辛格迪副总裁“细胞治疗数字化解决方案”
- c语言中v作用是什么意思,C语言里,\v是什么意思?
- docker+selenium+node-chrome-debug(node-firefox-debug)完成自动化测试环境的部署
- 关于内存条低压标压以及不同品牌容量内存条组建双通道笔记
- SANER 2018 论文阅读- Dissection of a Bug Dataset: Anatomy of 395 Patches from Defects4J
- matlab画光顺曲线,曲线曲面
- 数字 IC 技能拓展(16)Zynq 与 Pynq 都是什么呢
- 银河麒麟系统使用方法
- 【无标题】大一学生HTML5期末大作业——基于HTML+CSS制作女装商城 6页