注册 登录
编程论坛 VB6论坛

各位老师好!求助编辑一个大整数的快速乘除法可调用程序

ysr2857 发布于 2020-02-10 23:10, 35104 次点击
我用于判断和筛选10亿内的素数表的程序速度太慢,1亿内的需要3个小时,10亿内的更是24个小时没有结果,只好关闭了,已经是采用了快速判断法,但效果低,原因是不会大整数的快速乘除法程序,希望老师帮助。我仅会一点VB语句,希望是用VB编程的。
我的判断素数的程序,对单个整数几十位的可以迅速判断,素数表就不行了,只能到1亿,单个整数100位以上的也不行。希望老师指点,会快速乘法除法的原理的也请指导帮助!
谢谢!
   祝愿各位老师,新年快乐,阖家幸福安康,万事如意!

[此贴子已经被作者于2020-2-10 23:14编辑过]

401 回复
#102
ysr28572020-02-23 11:39
10090000000与10090001000之间有5对孪生素数对:
10090000241和 10090000243  孪中10090000242
10090000469和 10090000471  孪中10090000470
10090000517和 10090000519  孪中10090000518
10090000637和 10090000639  孪中10090000638
10090000727和 10090000729  孪中10090000728
用时196.904999999999秒
#103
ysr28572020-02-23 12:10
不是一种数据,不是一个问题,我不要这样数据,我要的是快速程序,一个是自己用这样程序,一个是送给朋友用于计算人家需要的数据。我的计算是为了验证程序的速度。
#104
xianfajushi2020-02-23 12:13
似乎看错了11位已经超过INT范围了!因此,计算是错的。
#105
ysr28572020-02-23 12:20
回复 104楼 xianfajushi
对,是11位的,需要大整数计算程序,把数值当字符串的计算程序,我的程序是模仿手工计算的,效率低速度太慢。
谢谢您!欢迎指导!
#106
xianfajushi2020-02-23 12:38
好了,找到了。但不知你要说明虾米,是说找到这5对用时很多?
只有本站会员才能查看附件,请 登录
#107
xianfajushi2020-02-23 12:38
好了,找到了。但不知你要说明虾米,是说找到这5对用时很多?
只有本站会员才能查看附件,请 登录
#108
ysr28572020-02-23 13:11
对,我的程序速度太慢!你的时间是多少?不到1秒?这不是很快吗?是vc版程序?我不懂vc程序代码。
#109
xianfajushi2020-02-23 13:27
得空闲转写为VB,才1000范围能用多少时间?之前我问过你的程序是咋样的,没正面回复?我是要看你所谓的已经采用快速都是一些虾米。
#110
ysr28572020-02-23 13:36
回复 109楼 xianfajushi
所谓的快速法就是前面的判断素数的程序,可以计算几十位几百位的大整数。当然计算孪生素数对不需要这么大的数据,但也是超过了11位,朋友要的,不知道要算到多少位。我的要求是能算上千万位的超大整数的,最低也是几万位的。
#111
ysr28572020-02-23 13:37
回复 109楼 xianfajushi
谢谢您!欢迎有空再弄,辛苦了!
#112
xianfajushi2020-02-23 14:00
要那么多位干嘛?家用电路又不是超级计算机!
只设计到提供的最大位数据,几万位走一遍都要花费很多时间,就如马拉松与短跑。
以下是引用ysr2857在2020-2-23 13:36:12的发言:
所谓的快速法就是前面的判断素数的程序,可以计算几十位几百位的大整数。当然计算孪生素数对不需要这么大的数据,但也是超过了11位,朋友要的,不知道要算到多少位。我的要求是能算上千万位的超大整数的,最低也是几万位的。

#113
ysr28572020-02-23 14:29
回复 112楼 xianfajushi
是的,我的程序仅能算到2万位再大就溢出,时间长,一步2万位的乘法或除法要几十分钟甚至一个小时,高手可以做到毫秒级的,没人指导我。
谢谢您!你的程序已经很快了,不知道能算几万位的不能?
#114
xianfajushi2020-02-23 16:03
目前没有,如果你有了希望能分享我一个。代码已经写好了,看我博客。
64位数据应该可以运算,这是系统和软件提供的最大范围。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-2-23 16:08编辑过]

#115
xianfajushi2020-02-23 16:03
这个论坛老是出现回复2次的!

[此贴子已经被作者于2020-2-23 16:07编辑过]

#116
ysr28572020-02-23 16:29
好的,非常感谢!我试试能算多大的。谢谢!我找到的乘法除法程序都是vc版的,您能解释一下吗?前面有一个乘法的程序?
有空再弄!谢谢您!
#117
ysr28572020-02-23 16:54
您的程序我没法用,不是vb版的,和我的vb6.0不兼容?多条语句变成了红字,无法改,提示是缺少结束语或缺少表达式。
#118
xianfajushi2020-02-23 17:23
哦,那你还的练练,VB6与语句区别很大?看懂程序就按程序逻辑自己写。
#119
ysr28572020-02-23 18:52
谢谢!我向你学习,学习学习这个程序!
下面是网上搞到的加减法程序,0是加法,1是减法,速度比我的程序快一点好象,时间是此程序为E-03,我的程序时间是E-02,相同的数据,是差一个小数点吧?
Private Sub Command1_Click()
Dim t As Double
t = Timer
Text3 = js(Trim(Text1), Trim(Text2), 0)
Text4 = Timer - t
End Sub

Private Sub Command2_Click()
Dim t As Double
t = Timer
Text3 = js(Trim(Text1), Trim(Text2), 1)
Text4 = Timer - t
End Sub

Private Sub Command3_Click()
Text1 = ""
Text2 = ""
Text3 = ""
Text4 = ""
End Sub

'2个长整数的加减法运算(最大长度无限)
Function js(num1 As String, num2 As String, mType As Integer) As String
Dim a1 As String, a2 As String
Dim s1() As String, S2() As String, Resu() As String
Dim I As Integer, J As Integer, k As Integer, Tmp As String
Dim t1 As Integer, t2 As Integer, JW As Integer, Fh As String
If Not IsNumeric(num1) Or Not IsNumeric(num2) Then
MsgBox "参于运算的只能是数字,不能含有其他字符", vbCritical, "错误提示"
Exit Function
End If
If Len(num1) < Len(num2) Or (Len(num1) = Len(num2) And Left(num1, 1) < Left(num2, 1)) Then
a1 = num2
a2 = num1
Fh = IIf(mType = 1, "-", "") '减法运算出现负数的情况
Else
a1 = num1
a2 = num2
End If
I = Len(a1)
J = Len(a2)
ReDim s1(I - 1), S2(J - 1)
ReDim Resu(IIf(mType = 0, I, I - 1))
For k = Len(a1) To 1 Step -1 '把数a1逐个放入数组s1
s1(I - k) = Mid(a1, k, 1)
Next
For k = Len(a2) To 1 Step -1 '把数a2逐个放入数组s2
S2(J - k) = Mid(a2, k, 1)
Next
JW = 0
For k = 0 To UBound(Resu) '从个位数开始相加减,结果入入数组resu
If k > UBound(s1) Then
t1 = 0
Else
t1 = Val(s1(k))
End If
If k > UBound(S2) Then
t2 = 0
Else
t2 = Val(S2(k))
End If
Select Case mType
Case 0 '加法运算
Tmp = t1 + t2 + JW
If Len(Tmp) > 1 Then
JW = Val(Left(Tmp, Len(Tmp) - 1))
Else
JW = 0
End If
Tmp = Right(Tmp, 1)
Case 1 '减法运算
I = t1 + JW - t2
If I < 0 Then
Tmp = I + 10
JW = -1
Else
Tmp = I
JW = 0
End If
End Select
Resu(k) = Tmp
Next
J = UBound(Resu)
For i = 0 To j '合并数组resu,结果输出到js1
js = js & Resu(J - I)
Next
For i = 1 To Len(js) '去掉前面的0
If Mid(js, I, 1) > "0" Then Exit For
Next
js = Fh & Mid(js, I)
If Len(js) = 0 Then
js = 0
Else
js = js
End If
End Function


[此贴子已经被作者于2020-2-23 19:03编辑过]

#120
xianfajushi2020-02-23 19:40
略看了这个程序,有点累赘,可优化,有可能提高速度。
而且还有错误
        For i = 0 To j '合并数组resu,结果输出到js1
            js = js & Resu(J - I)js是函数名,是js1还是js?
        Next

[此贴子已经被作者于2020-2-23 20:07编辑过]

#121
ysr28572020-02-23 21:01
回复 120楼 xianfajushi
输出结果是js,程序运行结果是正确的,速度没有版主wmf2014的快,优点是可以算无穷多位就是位数不受限制,如果版主能优化的话,非常感谢!非常欢迎!
#122
xianfajushi2020-02-23 23:20
300位四则运算才用几毫秒,神乎七鸡,我有兴趣继续关注。
2的64次方20位,300位的15倍,虾米诀窍能如此飞快,肯定不是跑步,是火箭,还是宇宙飞船?
#123
ysr28572020-02-24 05:47
回复 122楼 xianfajushi
谢谢指导关注!据说利用快速傅立叶变换或数论变换的大整数的乘法除法程序可以达到毫秒级的!我不懂,前面的vc版的程序也是快速乘法程序,不懂,好像就是利用快速傅立叶变换的乘法程序。
非常感谢!欢迎沟通欢迎关注!向你学习!
#124
xianfajushi2020-02-24 08:05
那么你的乘法根据虾米设计的,看描述反而比常规的求质数速度慢那么多?
都有些虾米资料可查?我搜索 快速傅里叶乘法 倒是有不少博客,有兴趣。
之前写过C#的字符串四则运算,速度奇慢,因为数据类型转换太多造成的,不如C++的快,之后对于字符串四则运算就没虾米兴趣了。

[此贴子已经被作者于2020-2-24 08:08编辑过]

#125
ysr28572020-02-24 09:28
我的乘法除法程序都是字符串模仿手工的程序,速度太慢。谢谢您!前面的一个vc程序就是利用快速傅立叶变换的乘法程序,供参考,您有空再看吧!
#126
xianfajushi2020-02-24 11:24
写的VB质数判断19位10000计算质数花费将近3小时,为求快速用傅里叶快速乘法,本不该使用模拟手工算法的。你给的那个例子js这个变量是怎么理解?
只有本站会员才能查看附件,请 登录
#127
ysr28572020-02-24 12:14
回复 127楼 xianfajushi
js为加减法可调用程序,如求a+b的和s为s=js(trim(a),trim(b),0).
我不会傅立叶变换不懂原理,才用的模仿手工计算的程序,速度太慢。
向你学习,谢谢!
#128
xianfajushi2020-02-24 13:18
你说的js带参好理解也是对的,问题是这个循环里面的js不带参该如何理解?
J = UBound(Resu)
For i = 0 To j '合并数组resu,结果输出到js1
js = js & Resu(J - I)
Next
#129
ysr28572020-02-24 13:44
回复 129楼 xianfajushi
js1是不对的,不过是个注释,不影响程序,js&re……就是把后面的连起来,成字符串输出结果。
我的理解很浮浅,大致是这样吧?能算出来,结果也对。
您说的带参是啥?是说后面的括号?输入的时候要带括号,按可调用程序的要求输入需要的量,有几个良就在括号输入几个量,这就算接口程序吧?输出的时候就是把js当一个变量了,只能是输出一个量就是计算结果若还要有其它量那就得用字母或符号隔开的。

[此贴子已经被作者于2020-2-24 13:53编辑过]

#130
ysr28572020-02-24 14:03
比如:
J = UBound(Resu)
For i = 0 To j '合并数组resu,结果输出到js1
js = js & Resu(J - I)
Next
js=js & "=" & a1 & "+" & a2
这样就输出了和等于哪两个数的和。

[此贴子已经被作者于2020-2-24 14:06编辑过]

#131
xianfajushi2020-02-24 15:02
原来如此,没用过VB6,这在里面是非法的,看来差别还是有的。
傅里叶的运算就是再多位数也不需要使用字符串来计算,因此模拟手工计算就没必要,否则傅里叶也就没虾米优势了,只有10的位数次方肯定会超过最大范围,不适合用数值运算,我大概看了看一些傅里叶的博客等资料,需要慢慢消化。https://wenku.baidu.com/view/bb149138df80d4d8d15abe23482fb4daa58d1d2f.html

[此贴子已经被作者于2020-2-24 15:54编辑过]

#132
ysr28572020-02-24 18:19
回复 131楼 xianfajushi
谢谢关注和指导!欢迎沟通!傅立叶变换的原理我还不明白,学习一下吧!谢谢!
#133
xianfajushi2020-02-25 12:53
1假设说INT类型求300位数,分段求是否可实现?
2如300个9乘以一个9=多少,应该是一个8后面298个9最后一个1,对?
3用分段乘法与加法会不会比弄成数组更快?
4如300个9乘以2个9=多少?
#134
ysr28572020-02-25 13:21
回复 133楼 xianfajushi
int类型300位会溢出的吧?无法这样弄,可能就算实现了也不快。高手会傅立叶变换的会快速乘法除法程序,对高手来说已经不是难题,咱找不到愿意帮忙的愿意指点的高手。
谢谢您!辛苦了!欢迎指导欢迎沟通!
#135
xianfajushi2020-02-25 17:17
虽说不能像傅里叶快速乘法那样LOG2N的速度,起码比数组逐位要快,数组的乘法是N2.也算是一种想法,很早就有这想法,今又想起,说不准会尝试一下看看速度。
#136
ysr28572020-02-25 19:33
回复 135楼 xianfajushi
谢谢!您试试吧,辛苦了,我还在研究快速傅立叶变换,不容易明白。
#137
xianfajushi2020-02-25 22:48
我也不时地看一些大数快速乘法的博文,分享一下https://blog.,如果有好的博文不妨一起分享。
#138
ysr28572020-02-26 00:49
谢谢您!我还没有弄懂,数论变换也可以用于大整数快速乘法,没有小数点各位数字都是可靠的,下面是数论变换:
http://www.
#139
xianfajushi2020-02-26 07:05
我看了史丰收的速算,从左到右,还是按位,没体会到虾米速度https://pan.baidu.com/s/1rbtv9
不过看到了从左到右计算有个方便之处就是不用暂存进位,可以直接与前面已计算处理的值直接加法运算进位,与我的一些想法一致。

[此贴子已经被作者于2020-2-26 07:22编辑过]

#140
ysr28572020-02-26 11:29
谢谢!这种方法提高速度不明显,不用倒序了,方便!
#141
xianfajushi2020-02-26 12:58
    大整数8位乘法("147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369147852369","36985214");
9*44=396位乘8位,包含显示用时,这样的速度可比傅利叶快速变换大数乘法?
只有本站会员才能查看附件,请 登录



[此贴子已经被作者于2020-2-26 13:06编辑过]

#142
ysr28572020-02-26 13:11
回复 141楼 xianfajushi
谢谢!是不慢,原理是啥?是vb版程序吗?希望指点一下!
#143
xianfajushi2020-02-26 13:15
刚设计出来的,新鲜出炉,看我博客,C++的,尚未转写VB,看得懂就自己去转写.
先用其他的程序验证一下答案是否正确,还要优化.
#144
xianfajushi2020-02-26 13:23
原理就是我发的构思
以下是引用xianfajushi在2020-2-25 12:53:21的发言:
1假设说INT类型求300位数,分段求是否可实现?
2如300个9乘以一个9=多少,应该是一个8后面298个9最后一个1,对?
3用分段乘法与加法会不会比弄成数组更快?
4如300个9乘以2个9=多少?

#145
xianfajushi2020-02-26 13:34
    大整数8位乘法("999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999","9");
只有本站会员才能查看附件,请 登录
#146
xianfajushi2020-02-26 13:49
    大整数8位乘法("99999999","99999999");
只有本站会员才能查看附件,请 登录
#147
xianfajushi2020-02-26 14:32
    大整数8位乘法("99999999999999","99999999");出错了丢失了1前面的0了.需要设法解决,理论和实践我的构思是可行的,也是计算正确的,有点小意外要处理,不是计算错误.
更新博客,后续程序还要优化,暂时解决了丢失0的问题,这个博客更新有点问题,排版格式不对,只好删除了先前的博客,重新发布.
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-2-26 15:12编辑过]

#148
ysr28572020-02-26 15:25
谢谢!我看不懂vc,小的数据看不出是否速度提高了,我的程序也是达到10^(-2)~10^(-3)之间,数量级不变,只有计算更大的数才能分辨!非常感谢!
#149
xianfajushi2020-02-26 15:31
那给个例子来运行试看.
#150
xianfajushi2020-02-26 15:45
4千位*8位
    大整数8位乘法("9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999","99999999");
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-2-26 15:46编辑过]

#151
ysr28572020-02-26 16:00
回复 150楼 xianfajushi
谢谢您!这次看出来了,是不慢!4千位乘以4千位的行吗?
123456789