|
我的文章不好找的话,我复制一下代码:
求乘法逆元的程序代码:
求乘法的逆元的程序代码,利用陆元鸿教授的矩阵变换法做的,计算小于10位的两个数的逆元,n模p的逆元。Private Sub Command1_Click()
Dim n, p, a, b, c, d, r
n = Trim(Text1.Text)
p = Trim(Text2.Text)
a = 1
b = 0
c = 0
d = 1
If Val(n) > Val(p) Then
m = n
q = p
s1 = 1
Else
m = p
q = n
s1 = 0
End If
Do Until Val(m) Mod Val(q) = 0
s = m \ q
r = m Mod q
s1 = s1 + 1
If s1 Mod 2 = 1 Then
a = a
b = a * s + b
c = c
d = c * s + d
Else
b = b
a = a + b * s
d = d
c = c + d * s
End If
m = q
q = r
Loop
If Val(a + b * m) = p Then
b = b
a = a + b * (m - 1)
d = d
c = c + d * (m - 1)
Else
If Val(b + a * m) = p Then
a = a
b = b + a * m
c = c
d = d + c * m
Else
b = b
a = a + b * (m - 1)
d = d
c = c + d * (m - 1)
End If
End If
Text3 = n & "模" & p & " 的逆元为:" & a
End Sub
Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""
End Sub
大数的乘法逆元的程序也出来了,如:67模147573952589676412927 的逆元为:145371356282367809749。由于代码太长,需要可调用程序如大数的乘法除法加法减法等,不发了。
分3种情况,注意7/4的逆元为3,输出结果为:当b+a*m=p=1+1*3=4,则a=a=3(程序前面已经递推得到a=3)。
(解释一下程序代码的步骤,例如求7模4的逆元为几?实际为3,因为3*7/4余数为1.步骤:n=7,p=4,当n>p时,m=n,q=p,当n小于p时,m=p,q=n,第二步开始,m=q,q=r,然后始终是求m/q的商s,和余数r,直到r=1或者r=0(因为任何整数除以1余数都是0)结束。
初始值a=1,b=0,c=0,d=1。
当步骤序号为奇数时,a=a,b=b+s*a,当步骤序号为偶数时,b=b,a=a+s*b。
最后分以下3种情况输出结果:
当a+b*m=p时,a=a+b*(m-1),当b+a*m=p时,a=a,其它情况则a=a+b*(m-1).
例如7/4的逆元就是b+a*m=p的情况,输出a=a=3(程序前面递推到这一步已经得到a=3)。(n不等于p,n=p没有逆元,这种情况不存在))
求40040模3 的逆元的手工计算:(我是用程序算出来的,其实就是古人说的求余数为1的乘率)
40040/3的余数为2,2*2/3余数为1,所以,逆元为2. |
|