`
Eastsun
  • 浏览: 308206 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

连分数及Pell方程的解法

阅读更多
  本文代码是我为了解决Project Euler上的问题而写的数学工具,之前的见:
    按字典顺序生成所有的排列
    筛法求素数


  所谓一个实数的连分数表示,是指将一个实数x写成以下形式:
    
  其中a0,a1,...,b1,b2,..都是自然数。
  当其中b1,b2,..都取为1时,我们称之为简单连分数表示(Simple Continued Fraction)
  可以证明:每一个不是完全平方数的自然数N,其平方根可以写成简单连分数表示,并且其中a1,a2,..呈周期出现。
  比如23的平方根的连分数表示为:
    
  并且其中[1,3,1,8]就是其一个周期,就是接下来的表示是由[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
        }
    }
}

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


  OK,现在我们可以来看看Project Euler上的第64题了:
引用

64 How many continued fractions for N ≤ 10000 have an odd period?

  题目很简单:求10000以内的自然数中,平方根的连分数表示的周期长度为奇数的有多少个。
  下面是该题的Scala解法(使用了上面的函数):
import eastsun.math.Util._
object Euler064 extends Application {
    
    val res = 1.to(10000).filter{ continuedFractionOfSqrt(_,null) % 2 ==1 }.length
    println(res)
}


  在将Project Euler66题前,先介绍一个数学名词:佩尔方程:形如 x^2 - D×y^2 = 1的不定方程称为佩尔方程。其中D为非完全平方数的自然数。并且称其所有正整数解(x,y)中使得x最小的那个解为最小解
  佩尔方程求解与平方根的连分数表示有着很大的关联,这里我就不细说了,对数学细节干兴趣的可以参考Math World上的Pell Equation。下面我直接给出Project Euler66题的叙述及其Scala代码:
引用
Find the value of D  ≤1000 in minimal solutions of x for which the largest value of x is obtained.

  就是说对D≤1000,求D使得佩尔方程x^2 - D×y^2 = 1的最小解中x的值最大。
  下面上代码:
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)
}
分享到:
评论

相关推荐

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

    ### 循环连分数与Pell方程的基本解 #### 概述 Pell方程是一种形式为\(x^2 - Dy^2 = 1\)的二次不定方程,其中\(D\)是非平方的正整数。这类方程在数论中具有重要意义,并且其解与连分数理论密切相关。本文旨在探讨...

    连分数及不定方程pell

    ### 连分数及不定方程Pell的相关知识点 #### 一、连分数的基本概念与性质 **连分数的定义:** 连分数是一种特殊的分数表示形式,它可以用来表示实数,尤其是无理数的一种精确表达方式。一个连分数可以写作: \[a_1...

    关于Pell方程最小解计算公式的另外2个定理 (2009年)

    ### 关于Pell方程最小解计算公式的另外2个定理 #### 摘要与背景 在数学领域中,Pell方程是形式为 \(x^2 - Dy^2 = 1\) 的二元二次不定方程,其中 \(D\) 是一个固定的正整数。当 \(D\) 不是完全平方数时,该方程有...

    算法-数论- 佩尔方程与连分数.rar

    著名的佩尔方程解法涉及到数的平方根的连分数展开。 连分数是一种特殊的分数表示形式,它将有理数表示为一个整数序列加上一连串的倒数序列,即\[ a_0 + \cfrac{1}{a_1 + \cfrac{1}{a_2 + \cfrac{1}{a_3 + \ddots}}}...

    关于Pell方程ax2-mqy2=±1(m∈Z+,3|a,q≡±1(mod6)是素数) (2012年)

    Pell方程ax2-by2=±1(a,b∈Z+,ab不是完全平方数)可解性的判别是一个非常有意义的问题。本文运用Legendre符号和同余的性质给出了形如ax2-mqy2=±1(m∈Z+,3|a,q≡±1(mod6)是素数,amq是非完全平方数)型Pell方程无正...

    广义Pell方程Ax2-By2=4的通解公式 (2014年)

    主要运用Lucas数的奇偶性,讨论了当A,B是适合A&gt;1,2 f AB且AB非平方数的正整数时,广义Pell方程的整数解(x,y),即给出了方程Ax2-By2=4适合gcd(x,y)=1的整数解(x,y)的通解公式.

    一个三次Diophantine方程的初等解法

    p2,…,直至pi(i≥2)(其中pi(i≥2)与1对模6同余,且pi(i≥2)为互异的奇素数)与y的平方之积的整数解问题至今仍未解决的问题,主要利用同余式、平方剩余、递归序列、Pell方程的解的性质得出了Diophantine方程x的立方加减1...

    Pell.m:Pell(d,s,n) 返回修正的 Pell 方程 x^2-dy^2=+ 的前 n 个正整数解-matlab开发

    对于整数 d 和 s,其中 d 为非平方和正数,Pell(d,s,n) 将前 n 个正整数解 (x,y) 返回到修正的 Pell 方程 x^2-dy^2=(-1)^s ,如果存在这样的解决方案。 如果 s 是偶数,即如果右侧等于 1,则这样的解总是存在,尽管...

    数论选讲--李学武_(Fibonacci数列_佩尔方程)

    2. 如果(x0,y0)是方程ax+by=c的一组解,则对任何整数t,(x0+bt,y0-at)也都是方程ax+by=c的解。 在实际计算中,为了避免计算中对负数和0的讨论,我们假定a&gt;0、b&gt;0,并且a&gt;=b。假定方程ax+by=c有解,即系数满足gcd(a,b...

    Pell方程X2-Dy2=-1可解性的一个判别条件 (2011年)

    Pell方程x2-Dy2=-1可解性的一个判别,是一个非常有意义的问题。本文运用Pell方程x2-Dy2=1的解的基本性质,给出了Pell方程x2-Dy2=-1可解性的一个判别条件,并给出了一些有用的推论。

    关于Pell数的Diophantine方程x2 + Uyn = Vzn (2011年)

    设n是正奇数,Un = (αn+βn) /2,Vn = (αn-βn) /22,其中α=1 + 2,β=1-2.运用Pell数的算术性质讨论了方程x2 + Uyn = Vzn的正整数解(x,y,z),证明了当n≡±3( mod8)时,该方程仅有正整数解(x,y,z) =( V2n-1,2,4) .

    欧几里得算法的应用 (WC2009)

    连分数不仅可以用于逼近无理数,还可以用于求解Pell方程等特殊类型的丢番图方程。 ##### 3.1 连分数 连分数是一种表示有理数或无理数的形式,通常写作无限序列的形式。在数论中,连分数特别有用,因为它可以提供...

    关于不定方程x2-Dy2=-1的解的确定* (2006年)

    综上所述,本文通过初等数学的方法,不仅给出了判别Pell方程x^2 - Dy^2 = -1是否有整数解的几个方法,而且对原有的解法进行了推广,并可能涉及到素数、Legendre符号、二次剩余、连分数等数论工具的综合运用。...

    matlab开发-Pellm

    在MATLAB中,"Pellm"看起来是一个用于解决Pell方程的自定义函数。Pell方程是一类代数方程,形式为x^2 - dy^2 = n,其中d是一个非平方整数,n是任意整数。这个方程在数论和数学领域有重要的应用,例如在寻找无理数的...

    关于不定方程组x2-6y2=1,y2-Dz2=4 (2012年)

    Pell方程有无限多个解,并且其解可以用连分数方法或者递归公式来找到。 5. Diophantine方程:是一种多项式方程,其解被要求是在整数、有理数、或者更一般的代数数中寻找。 在研究这个特定的不定方程组时,作者首先...

    关于不定方程x2-Dy4=1 (2001年)

    Pell方程的解可以通过连分数的方法来求得。此外,Pell方程的基本解是一个重要的概念,它是指该方程的一组解中使得解的绝对值最小的一组。 文件中提到的最小解概念是针对特定的Pell方程的。最小解是一个解,且该解...

    pell是最简单最小5kB的所见即所得的WYSIWYG文本编辑器

    pell是一款轻量级的、基于JavaScript的所见即所得(WYSIWYG)文本编辑器,它的体积小巧,仅为5kB。这样的轻量化设计使得pell在网页应用中能够快速加载,减少用户等待时间,同时也降低了对服务器带宽的需求。本文将...

    struts2+pell文件上传

    Pell是一个简单的、无JavaScript的文件上传组件,它通常被集成到Struts2框架中以实现用户友好的文件上传功能。在Struts2中集成Pell,可以为用户提供一个直观的界面来选择和上传文件,而无需复杂的前端技术。 首先,...

Global site tag (gtag.js) - Google Analytics