连分数及Pell方程的解法

  本文代码是我为了解决[url=http://projecteuler.net/]Project Euler[/url]上的问题而写的数学工具,之前的见:
    [url=http://eastsun.iteye.com/blog/207614]按字典顺序生成所有的排列[/url]
    [url=http://eastsun.iteye.com/blog/240339]筛法求素数[/url]


  所谓一个实数的[color=olive]连分数表示[/color],是指将一个实数x写成以下形式:
    [img]http://www.iteye.com/upload/picture/pic/22501/26578e33-e037-3e65-b4e3-888e38b5e83a.gif?1222869669[/img]
  其中a0,a1,...,b1,b2,..都是自然数。
  当其中b1,b2,..都取为1时,我们称之为[color=olive]简单连分数表示[/color](Simple Continued Fraction)
  可以证明:每一个不是完全平方数的自然数N,其平方根可以写成[color=olive]简单连分数表示[/color],并且其中a1,a2,..呈周期出现。
  比如23的平方根的连分数表示为:
    [img]http://www.iteye.com/upload/picture/pic/22503/923d2bb2-28c4-3e8b-99e2-141a43f7a12e.jpg?1222871288[/img]
  并且其中[color=green][1,3,1,8][/color]就是其一个周期,就是接下来的表示是由[1,3,1,8]循环出现。
  下面是得到一个自然数平方根的简单连分数表示的Scala代码:
/**
&#Util.scala
utils for mathematical algorithm,include:
# get all primes below bound in order
# generate all permutations in lexicographical order
# get simple continued fraction representation of the sqrt of n
@author Eastsun
*/
package eastsun.math

object Util {
/**
Get simple continued fraction representation of the sqrt of n
*/
def continuedFractionOfSqrt(n: Int,buf: Array[Int]):Int = {
val sq = Math.sqrt(n)
var (p,q) = (sq,n - sq*sq)
if(q == 0) 0
else{
var idx = 0
var an = 0
do {
an = (sq + p)/q
if(buf != null) buf(idx) = an
idx += 1
p = an*q - p
q = (n - p*p)/q
}while(an != 2*sq)
idx
}
}
}

  简单解释一下函数[color=violet]def continuedFractionOfSqrt(n: Int,buf: Array[Int]):Int[/color]的功能:该函数有两个参数,其中n表示要求其平方根连分数表示的自然数n;buf用来保存其连分数表示中a1,a2,...的一个周期(注意,没有包括a0),该参数可以为null。函数返回一个Int,表示a1,a2,..周期的大小,也就是buf中保存数据的长度。
  下面是对使用该函数的一个演示:
[quote]scala> var buf = new Array[Int](4)
buf: Array[Int] = Array(0, 0, 0, 0)

scala> continuedFractionOfSqrt(23,buf)
res8: Int = 4

scala> buf.mkString(",")
res9: String = 1,3,1,8

scala>[/quote]

  OK,现在我们可以来看看Project Euler上的[url=http://projecteuler.net/index.php?section=problems&id=64]第64题[/url]了:
[quote]
64 How many continued fractions for N ≤ 10000 have an odd period?[/quote]
  题目很简单:[color=blue]求10000以内的自然数中,平方根的连分数表示的周期长度为奇数的有多少个。[/color]
  下面是该题的Scala解法(使用了上面的函数):
import eastsun.math.Util._
object Euler064 extends Application {

val res = 1.to(10000).filter{ continuedFractionOfSqrt(_,null) % 2 ==1 }.length
println(res)
}


  在将Project Euler66题前,先介绍一个数学名词:[url=http://mathworld.wolfram.com/PellEquation.html]佩尔方程[/url]:形如 x^2 - D×y^2 = 1的不定方程称为佩尔方程。其中D为非完全平方数的自然数。并且称其所有正整数解(x,y)中使得x最小的那个解为[color=olive]最小解[/color]。
  佩尔方程求解与平方根的连分数表示有着很大的关联,这里我就不细说了,对数学细节干兴趣的可以参考Math World上的[url=http://mathworld.wolfram.com/PellEquation.html]Pell Equation[/url]。下面我直接给出[url=http://projecteuler.net/index.php?section=problems&id=66]Project Euler66题[/url]的叙述及其Scala代码:
[quote]Find the value of D ≤1000 in minimal solutions of x for which the largest value of x is obtained.[/quote]
  [color=blue]就是说对D≤1000,求D使得佩尔方程x^2 - D×y^2 = 1的最小解中x的值最大。[/color]
  下面上代码:
import eastsun.math.Util._
object Euler066 extends Application {
val buf = new Array[Int](1000)
var (res,max,d) = (2,3:BigInt,1)
while(d <= 1000){
val pd = continuedFractionOfSqrt(d,buf)
if(pd > 0){
val sq = Math.sqrt(d)
var (x0,y0) = (sq:BigInt,1:BigInt)
var (x1,y1) = ((buf(0)*sq+1):BigInt,buf(0):BigInt)
val cnt = if(pd%2 == 1) 2*pd-1 else pd-1
var idx = 1
while(idx < cnt){
var t = x1
var a = buf(idx%pd)
x1 = x1*a + x0
x0 = t
t = y1
y1 = y1*a + y0
y0 = t
idx += 1
}
if(x1 > max){
max = x1
res = d
}
}
d += 1
}
println(res)
}
连分数计算器 # ContinuedFraction #### 项目介绍 连分数计算器 支持连分数和小数输入,高精度小数转连分数,无精度损失,用于获取小数在一定范围内最接近的分数 例如π的高精度转连分数 str=> 3.14159265358979 num=> 3.14159265358979000000000000000000000 ctf=> [3;7,15,1,292,1,1,1,2,1,3,1,12,2,4,1,1,3,2,2,1,18,1,2,2,1,7,2,2] 1=> 3.00000000000000000000000000000000000 3 3/1 2=> 3.14285714285714285714285714285714286 7 22/7 3=> 3.14150943396226415094339622641509434 15 333/106 4=> 3.14159292035398230088495575221238938 1 355/113 5=> 3.14159265301190260407226149477372968 292 103993/33102 6=> 3.14159265392142104470871594159265392 1 104348/33215 7=> 3.14159265346743670552045478534915632 1 208341/66317 8=> 3.14159265361893662339750030141060162 1 312689/99532 9=> 3.14159265358107777120441930658185778 2 833719/265381 10=> 3.14159265359140397848254241421927966 1 1146408/364913 11=> 3.14159265358938917154368732170690821 3 4272943/1360120 12=> 3.14159265358981538324194377730744861 1 5419351/1725033 13=> 3.14159265358978910556761228975786423 12 69305155/22060516 14=> 3.14159265358979009430798477470203822 2 144029661/45846065 15=> 3.14159265358978998813773682909318658 4 645423799/205444776 16=> 3.14159265358979000750767514045607416 1 789453460/251290841 17=> 3.14159265358978999879486079142367388 1 1434877259/456735617 18=> 3.14159265358979000014512509093352444 3 5094085237/1621497692 19=> 3.14159265358978999997843356720301190 2 11623047733/3699731001 20=> 3.14159265358979000000839600248412328 2 28340180703/9020959694 21=> 3.14159265358978999999968162106153623 1 39963228436/12720690695 22=> 3.14159265358979000000001193310441815 18 747678292551/237993392204 23=> 3.14159265358978999999999517378526962 1 787641520987/250714082899 24=> 3.14159265358979000000000056801156993 2 2322961334525/739421558002 25=> 3.14159265358978999999999978607241192 2 5433564190037/1729557198903 26=> 3.14159265358979000000000002025128805 1 7756525524562/2468978756905 27=> 3.14159265358978999999999999894805542 7 59729242861971/19012408497238 28=> 3.14159265358979000000000000024695141 2 127215011248504/40493795751381 29=> 3.14159265358979000000000000000000000 2 314159265358979/100000000000000 立即下载

相关推荐

pell方程的几个公式

pell方程的几个公式pell方程的几个公式pell方程的几个公式pell方程的几个公式pell方程的几个公式pell方程的几个公式pell方程的几个公式pell方程的几个公式

佩尔(Pell)方程

于是可以得到递推式: ,k>=1 例题1:HDU2281 Square Number 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2281 12+22+……+n2 = n(n+1)(2n+1)/6 将

li_wei_quan的博客 2629

循环连分数与Pell方程的基本解.pdf

pell方程的基本解的性质、定理、解法; 给出实例x^2-94*y^2=1的解法。

一些Pell方程解的性质的整理

Pell方程是一类二元二次不定方程,其形如\[x^2-dy^2=1\]其中\(d\)为一非完全平方数的正数。 对于Pell方程解的存在性和求法以及超出了本文的范畴,在此仅讨论在已知Pell方程最小解的情况下的一些操作。 假设我们已知了Pell方程的最小解\(( x_0, y_0)\),那么其他的解可以由最小解的幂次得到,即\[x_n+\sqrt{d}y_n=(x_0+\sqrt{d}y_...

ddaarsel63181的博客 464

接口调试必看:status显示canceled的3种常见原因及修复方法

本文深度解析了接口调试中status显示canceled的三种核心原因:网络层中断(如请求超时)、应用层逻辑主动取消(如请求竞态、组件卸载)以及用户交互与浏览器行为。文章提供了从诊断到修复的系统性方案,包括分析Network Timing、使用Axios CancelToken、优化请求策略与性能,帮助开发者从根本上解决这一常见问题。

bb456的博客 937

VUE3如何使得大屏自适应的几种方法?

16:9。

weixin_42711805的博客 1万+

UVA 138 - Street Numbers (佩尔方程递推求解)

题意:求解(x,y)这样的pai 将求解不定方程转化为

虽然冲动永远比坚持容易~ 2119

Java8对接三方流式接口,并实时输出(GPT)

【代码】Java8对接三方流式接口,并实时输出(GPT)

m0_58617940的博客 1728

Pell方程解法+连分数自己整理

1、首先学习一下连分数。

Beyyes 4983

Vim 入门到够用:Linux 文本编辑器的三种模式、常用操作与实战技巧

i 进入编辑模式Esc 退出编辑模式回到命令模式: 从命令模式进入底行模式编辑,不一定非得“打开就直接打字”。一旦你接受了“模式”这件事,后面很多操作都会顺起来。学 Vim,不要追求一次学全,先把“命令模式—编辑模式—底行模式”这条主线练熟。只要这条主线通了,后面的复制、删除、搜索、替换,都是顺手补上去的能力。

Web安全工具库 803

VMware Converter 6.2.0保姆级教程:从物理机到ESXi主机的完整迁移指南(含常见错误排查)

本文提供VMware Converter 6.2.0从物理机迁移至ESXi主机的完整保姆级教程。详细解析了迁移前的环境规划、核心转换过程步骤、版本差异对比,并重点针对代理安装失败、任务卡顿、虚拟机无法启动等常见错误提供了实战排查与解决方案,确保P2V迁移顺利进行。

sam99的博客 380

佩尔方程实例讲解

前言 佩尔方程是一种不定二次方程。 下面的不定方程称为佩尔(Pell)方程: 其中 d 为正整数,若 d 是完全平方数,则这个方程式只有平凡解(1,-1,0)。若 d 是非平方数。佩尔方程存在无穷多个解。 若佩尔方程的最小特解(最小正整数解)是(x1,y1),那么可有迭代公式: ...

Herishwater的博客 6638

GameFramework框架详解之 Network网络框架

NetworkManager只负责维护NetworkChannel,实际的有种我们简历网络连接的也是NetworkChannel作为一个网路频道,这样管理起来比较方便,比如:一个游戏可能有多个网络连接,那么我们建立多个网络频道即可,或者当我们一个网络频道断线后,我们可以直接再新建一个,防止数据混乱。/// /// 网络管理器。/// /// 网络频道。/// 用户自定义网络错误事件。/// 检查是否存在网络频道。/// 获取网络频道。/// 获取所有网络频道。

TxNet 3368

【学习笔记】Pell方程

写死我啦,蛋疼。

七代目鸽影 1617

华为OD面试八股真题 - 操作系统相关 - 2

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 968

RK3588, 绘制中文OSD,实现左右对齐

基于RK3588,实现中文OSD, 上下左右对齐。

J。 662

关于Pell方程及其求解技巧

Pell方程在不定方程里经常出现,解其他方程的时候最后往往归结为对某个pell方程的讨论。本文不加证明的叙述几个pell方程的结论,并讨论怎么用连分数来具体算出特定pell方程的解。 Pell方程,一般是指x^2-dy^2=1.① 定理1:设d是一个正整数且不是一个完全平方,则方程①有无穷多组整数解x,y.设a^2-db^2=1,a>0,b>0,是所有x>0,y>0的解中使x+y√

LzyRapX 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pell方程

一、连分数法求解最小正整数解。 自己看着公式敲的。。没有题目检验,但是暴力对拍了一会,应该是对的吧。。。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #incl...

_Griefs 508

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Pell方程

Pell方程 形如x2−D∗y2=1x^2-D*y^2=1x2−D∗y2=1​​的方程 当DDD​不为完全平方数时有整数解 又因为每一个不是完全平方数的整数DDD​,其平方根可以写成简单循环连分数的形式 取D\sqrt{D}D​​的连分数的有限周期作为一个有限分数 则分子、分母分别对应x、yx、yx、y的最小值 sagemath实现 def Pell(D,numbers=100): temp = continued_fraction(sqrt(D)) for i in range(number):

M3ng@L的博客 974

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

关于丢番图方程x^2-dy^2=-1

我们知道丢番图方程,其中d是非完全平方正整数,那么此方程就是Pell方程,到目前为止对于它的最优求解方 法就是经典的连分数问题。可以看这里:http://blog.csdn.net/acdreamers/article/details/8529686   那么对于上述的Pell方程来说,它一定是有解的,而现在我们研究另一个丢番图方程: ,其中同样要求d是非完全平方正整数,对于这个方程,它就

ACdreamer 5737

POJ 2427 Smith's Problem Pell方程

题目链接 : http://poj.org/problem?id=2427 PELL方程几个学习的网址: http://mathworld.wolfram.com/PellEquation.html wolfram的讲解 http://hi.baidu.com/aekdycoin/item/a45f7c37850e5b9db80c03d1 AC神的博客 ht...

weixin_30815427的博客 127

HDU3292.No more tricks, Mr Nanguo(pell 方程理论 + 矩阵快速幂)

今天刚刚学完pell 方程理论记录一下了 证明略,给大家推荐两个证明比较好的博客和学习网站 oi-wike-Pell方程 这是一个很好的总结博客添加链接描述 #include<bits/stdc++.h> #define ll long long using namespace std; const int N = 2; const int mod = 8191; struct Matrix{ ll a[N][N]; int n,m; Matrix(int b, int

weixin_45908221的博客 171

【pell方程学习】

转自该博客 POJ-1320 Street Numbers pell方程   题目链接:http://poj.org/problem?id=1320   此题可以打表水过,但这里涉及的一个知识点,那就是pell方程,形如 ax^2-by^2=1(a,b为非完全平方数)。   本题最后化简得公式:x^2-8y^2=1   pell方程的迭代解为:     Xn = Xn-1 * X1 +...

__似水流年__的博客 1391

[学习笔记] Pell方程

感谢这两位巨佬,部分思路和图片来源于他们的启发: IBN5100 The-Pines-of-Star 是什么? Pell\text{Pell}Pell方程主要用来解决下面形式的方程: x2−dy2=1x^2-dy^2=1x2−dy2=1其中ddd是正数且不是完全平方数,若x,yx,yx,y都为整数的解称为这个方程的解,其中x+ydx+y\sqrt dx+yd​最小的那组解就称为Pell\text{Pell}Pell方程的基本解,我们要解决两个问题:求出基本解和用它扩展出所有解。 基本解? 本文结论大多不给出

C202044zxy的博客 1287

数论笔记 · 佩尔方程(连分数)

http://blog.sina.com.cn/s/blog_5d06e2390100ll92.html  佩尔方程实际上并不是佩尔提出的,而是费尔马提出,却被欧拉误记为佩尔提出,因此佩尔方程的名称沿用至今。身为不定方程的特殊一类,佩尔方程与连分数,二次型,代数论等等有着重要的联系,因而是数论中最经典的篇章之一。令d 为非平方数的正整数,那么佩尔方程(Pell Equation)为:

海盗船 3468
上一篇: How To JUST DO IT
下一篇: 使用基于邻接表的Dijkstra算法求解Project Euler问题
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值