Pell佩尔方程 x^2-61*y^2=1

有一个特殊的佩尔方程:x^2-61*y^2=1

下面我将编程求解它的最小解

如果直接枚举x和y的话,大约需要10秒

代码:

#include<iostream>
using namespace std;

int main()
{
	long long x = 2, y = 0, flag = 3;		//flag=x*x-61*y*y-1
	while (flag)
	{
		if (flag > 0)
		{
			flag -= 61 * (2 * y + 1);
			y++;
		}
		else
		{
			flag += 2 * x + 1;
			x++;
		}
	}
	cout << x << "  " << y << "  " << x*x;
	system("pause>nul");
	return 0;
}

如果先数学求解的话,自然会快一些。

首先,x必定是奇数,y必定是偶数

设x=s*2+1,y=t*2

那么s(s+1)=61t*2

分解:有2种情况

第一种,s=61*a^2,s+1=b^2,那么b^2-61*a^2=1,与x,y是最小解矛盾。

第二种,s=a^2,s+1=61*b^2,那么a^2-61*b^2=-1,化成这种佩尔方程了。

如果这个方程有解的话,原方程也有解,而且这个方程的解比原方程的解小得多。

2个方程是几乎差不多的,代码只需要略略改改就可以了。

代码:

#include<iostream>
using namespace std;

int main()
{
	long long x = 2, y = 0, flag = 5;
	while (flag)
	{
		if (flag > 0)
		{
			flag -= 61 * (2 * y + 1);
			y++;
		}
		else
		{
			flag += 2 * x + 1;
			x++;
		}
	}
	cout << x*x * 2 + 1;
	system("pause>nul");
	return 0;
}

这个不需要1秒就可以算完。

最后,附上PDF的截图

时间: 2024-11-01 13:46:26

Pell佩尔方程 x^2-61*y^2=1的相关文章

[NBUT 1224 Happiness Hotel 佩尔方程最小正整数解]连分数法解Pell方程

题意:求方程x2-Dy2=1的最小正整数解 思路:用连分数法解佩尔方程,关键是找出√d的连分数表示的循环节.具体过程参见:http://m.blog.csdn.net/blog/wh2124335/8871535 当d为完全平方数时无解 将√d表示成连分数的形式,例如: 当d不为完全平方数时,√d为无理数,那么√d总可以表示成: 记 当n为偶数时,x0=p,y0=q:当n为奇数时,x0=2p2+1,y0=2pq 求d在1000以内佩尔方程的最小正整数解的c++打表程序(正常跑比较慢,这个题需要离

HDU 3292 【佩尔方程求解 &amp;&amp; 矩阵快速幂】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=3292 No more tricks, Mr Nanguo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 587    Accepted Submission(s): 400 Problem Description Now Sailormoon

POJ1320 Street Numbers【佩尔方程】

题目链接: http://poj.org/problem?id=1320 题目大意: 求解两个不相等的正整数N.M(N<M),使得 1 + 2 + - + N = (N+1) + - + M.输出前10组满足要求 的(N,M). 思路: 要使 1 + 2 + - + N = (N+1) + - + M,那么 N*(N+1)/2 = (M-N)(M+N+1)/2,即 (2*M+1)^2 - 8*N^2 - 1,令x = 2*M + 1,y = N,就有x^2 - 8*y^2 = 1,就变成了典型的

C语言之基本算法26—佩尔方程求解

//穷举法! /* ====================================================== 题目:求佩尔方程x*x-73*y*y=1的解. ====================================================== */ #include<stdio.h> #include<math.h> int main(void) { int x,y; double t; for(y=1;y<=10000000;y+

Uva 138-Street Numbers(佩尔方程)

题目链接:点击打开链接 题意: 一条街上有n个房子编号从1到n 设某人的房子编号为k 求满足 1+2+3+..(k-1)=(k+1)+...+n 的10组n,k值 两边求和化简得 n^2+n-2k^2=0;  两边同乘4  -> 4n^2+4n+1-8k^2=1;  -> (2n+1)^2-2(2k)^2=1; 令 x=2n+1 y=2k 得 x^2-2y^2=1; 形如 x^2-ny^2=1 (n为任意正整数) 的方程称为佩尔方程,很容易求出其最小解 (x0,y0) 然后 xi=x0*x(i

佩尔方程

什么是佩尔方程 定义:若一个不定方程具有这样的形式:则称此二元二次不定方程为佩尔方程 若n是完全平方数,则这个方程式只有平凡解. 佩尔方程的解    设为的两个解,则有 两式相乘得化简整理得,式子中加一个减一个 可得 所以有 写成矩阵形式,可得 因此只要知道最小的一个特解,就可以算出其他的解 佩尔方程的特解 暴力求解法 令,求出,然后检查通过这个,是否使得佩尔方程成立 void serach(ll n,ll &x,ll &y) { y=1; while(1) { x=(1ll)*sqrt(

POJ 1320 Street Numbers 【佩尔方程】

任意门:http://poj.org/problem?id=1320 Street Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3181   Accepted: 1776 Description A computer programmer lives in a street with houses numbered consecutively (from 1) down one side of the

Problem G: 深入浅出学算法008-求佩尔方程的解

Description 求关于x y的二次不定方程的解 x2-ny2=1 Input 多组输入数据,先输入组数T 然后输入正整数n(n<=100) Output 对于每组数据输出一行,求y<=10000的最小正整数解 ,输出y的值,如果在此范围内没有解则输出No Sample Input 1 73 Sample Output No #include <stdio.h> #include <math.h> int main() { int t,n; int i,j; in

Pell方程(求形如x*x-d*y*y=1的通解。)

佩尔方程x*x-d*y*y=1,当d不为完全平方数时,有无数个解,并且知道一个解可以推其他解. 如果d为完全平方数时,可知佩尔方程无解. 假设(x0,y0)是最小正整数解. 则: xn=xn-1*x0+d*yn-1*y0 yn=xn-1*y0+yn-1*x0 证明只需代入. 如果忘记公式可以自己用(x0*x0-d*y0*y0)*(x1*x1-d*y1*y1)=1 推. 这样只要暴力求出最小特解,就可以用快速幂求出任意第K个解. Street Numbers Time Limit: 1000MS