请输入您要查询的百科知识:

 

词条 佩尔方程
释义

由费尔马提出,但后来欧拉误记为佩尔提出,并写入他的著作中。后人多称佩尔方程。沿续至今

简介

设d是正整数,且非平方数。

下面的不定方程称为佩尔(Pell)方程:

x^2-dy^2=1……①

①一定有无穷多组正整数解

这是初等数论中最经典的内容之一。

假设(x_0,y_0)是①中使x+y^0.5最小的解(称为①的基本解), 那么①的所有的正整数解可写为

x_n=1/2[(x_1+y_1d^0.5)^n+(x_1-y_1d^0.5)^n]

y_n=1/(2d^0.5)[(x_1+y_1d^0.5)^n-(x_1-y_1d^0.5)^n]

∴x_n+y_n*(d)^0.5=(x_0+y_0*(d)^0.5)^(n+1)

且不难导出x_n,y_n满足的线性递推关系

x_n=2x_1x_(n-1)-x_(n-2)

y_n=2x_1y_(n-1)-y_(n-2)

佩尔方程与连分数,二次型,代数数域等等都有密切联系。

在一般的函数域上,我们也有类似的佩尔方程, 它和向量丛的稳定性有着微妙的关系。

以上的公式就是Pell方程的一般形态.

对于 当n为完全平方数时无解;

1. 首先构造一个系数矩阵,显然为了构造这个矩阵,我们需要先得到

下面方程的一个最小特解(x,y>0)

利用Euler的算法

1: p[−1] ⇐ 1; p[−2] ⇐ 0

2: q[−1] ⇐ 0; q[−2] ⇐ 1

3: a[0] ⇐sqrt(n)

4: g[−1] ⇐ 0; h[−1] ⇐ 1

5: for i = 0 → ∞ do

{

6: g[i] ⇐ −g[i−1] + a[i]h[i−1]

7: h[i] ⇐ (n−g[i]*g[i]) / h[i-1]

8: a[i+1] ⇐ floor( (g[i]+a[0]) / h[i]

9: p[i] ⇐ a[i]p[i−1] + p[i−2]

10: q[i] ⇐ a[i]q[i−1] + q[i−2]

if( p[i]*p[i]-n*q[i]*q[i]=1 ) return (p[i],q[i]);

}假设我们得到了以上方程的最小特解: x0 y0 (x0,y0>0,并是最小的满足条件的解)

C++程序求解佩尔方程:

#include <iostream>

#include <cmath>

using namespace std;

struct PellAns

{

int p,q;

};

struct Node

{

int g,h;

};

PellAns Solve( int n)

{

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]=(int)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 = (n-w[2].g*w[2].g)/w[1].h;

a[3] = (int)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-n*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()

{

int n;

PellAns ans;

while( scanf("%d",&n) )

{

ans = Solve(n);

printf("%d %d\",ans.p,ans.q);

}

return 0;

}

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/1 13:10:16