当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

二元一次不定方程的大衍求一术解法的VB源码

发表于: 2010-08-28   作者:bardo   来源:转载   浏览次数:
摘要: 二元一次不定方程的大衍求一术解法的VB源码         我们清楚,二元一次不定方程可用欧几里德扩展算法,或者同余方程的欧拉解法,以及中国传统的方法大衍求一术来解。同余方程的欧拉解法程序算法复杂,且需经递归。而欧几里德扩展算法如果不递归,则也需要进行回退求解。所以,只有大衍求一术才是最简单的算法。这是08年就写出的老代码了,VB6的源码。从

二元一次不定方程的大衍求一术解法的VB源码

 

 

    我们清楚,二元一次不定方程可用欧几里德扩展算法,或者同余方程的欧拉解法,以及中国传统的方法大衍求一术来解。同余方程的欧拉解法程序算法复杂,且需经递归。而欧几里德扩展算法如果不递归,则也需要进行回退求解。所以,只有大衍求一术才是最简单的算法。这是08年就写出的老代码了,VB6的源码。从本人其它博客现搬到iteye.com网站,分享给更多的人。以下是VB程序的源码。

Option Explicit

'visual basic source code for finding x, y such that linear diophantine equation
'Copyright: 2008 Bardo QI

Function gcd(ByVal a As Long, ByVal b As Long)
    'get great common division
    Dim c As Long, tmp As Long
   
    If (a < b) Then
        tmp = a
        a = b
        b = tmp
    End If

    Do While (b <> 0)
        c = b
        b = a Mod b
        a = c
    Loop
    gcd = a

End Function

Function gma(ByVal g As Long, ByVal m As Long) As Long
    'get special solution for linear diophantine: ax+by=1
    Dim LT As Long, RT As Long, LD As Long, RD As Long
    Dim tmp As Long, x As Long
   
    If Abs(g) > Abs(m) Then
        g = g Mod m
    End If
   
    LT = 1: LD = 0: RT = g: RD = m
    x = 0

    Do While (RT <> 1)
        x = RD \ RT
        RD = RD Mod RT
        LD = x * LT + LD
       
        x = RT \ RD
        If RD = 1 Then
            LT = (x - 1) * LD + LT
            RT = 1
            Exit Do
        Else
            RT = RT Mod RD
        End If
        LT = x * LD + LT
    Loop
    gma = LT
   
End Function

Function Diophantine(ByVal a As Long, ByVal b As Long, ByVal c As Long, _
                    x As Long, y As Long, ar As Long, br As Long) As Boolean
    'Find the x,y such that a*x + b*y = k*gcd(a,b)
    Dim g As Long, tmp As Long, x0 As Long, y0 As Long
    Dim am As Long, bm As Long, t As Long
   
    g = gcd(Abs(a), Abs(b))
    If (c Mod g <> 0) Then
        Diophantine = False: Exit Function
    End If
    If a < 0 Then
        a = -a: b = -b: c = -c
    End If
    br = a / g: ar = b / g
    am = br: bm = ar
    If ar > br Then
        bm = ar Mod br
    End If
    If am > bm Then
        y0 = gma(Abs(bm), Abs(am))
    Else
        y0 = 1
    End If
    If (b < 0) Then
        y0 = -y0
    End If
    x0 = (1 - ar * y0) / br
    x = c * x0 / g: y = c * y0 / g
    'let y to mininized value
    t = y \ br
    y = y Mod br
    x = x + ar * t
   
    ar = -ar
   
    Diophantine = True
   
End Function

二元一次不定方程的大衍求一术解法的VB源码

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
计算一/二元一次方程的类(用于动画控制) 源码: // // YXMath.h // // http://home.cnblogs.com/u
  本文代码是我为了解决 Project Euler上的问题而写的数学工具,之前的见:      按字典顺序生
/* 【任务5】设计一元一次方程类,求形如ax+b=0的方程的解。 例如:输入3x-8=0时,输出的方程的解为
开发过程中用不到一元一次方程吗?非也,iOS开发中经常会遇到根据某个ScrollView动态偏移量的值来实时
note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同
在小学,我们就学习了一元一次方程,对于其一般形式是$ax+b=0(a \neq 0)$,很容易解得它的解$x=-\fr
ava程序员的第一次VB.NET开发 1.确定流程思路 最近被迫进行了一次VB.NET开发。作为一次痛苦的回忆,
把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase(译注:rebase 的翻译暂定为“
把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase(译注:rebase 的翻译暂定为“
把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase(译注:rebase 的翻译暂定为“
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号