注册 登录
编程论坛 VB6论坛

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

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

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

401 回复
#252
ysr28572021-03-25 14:39
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801*
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801=
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601有4888位,用时1.316406秒(这个是前面的4位一组的快速乘法程序的结果,这个速度已经可以用来搜索和判断几千位的大素数了,但距离世界纪录还远着呢,继续优化吧,继续努力!)
#253
ysr28572021-03-26 21:41
还可以用迭代法快速计算,发个截图,如何算的?希望老师指点,谢谢!
只有本站会员才能查看附件,请 登录
#254
ysr28572021-03-28 23:01
这个迭代法会用到复数域,会用到如下公式:
sinx=(e^ix-e^-ix)/(2i),cosx=(e^ix+e^-ix)/2.\叫做欧拉公式.将e^ix=cosx+isinx中的x取作π就得到:e^iπ+1=0.这个也叫做欧拉公式.
复数除法定义:满足(c+di)(x+yi)=(a+bi)的复数x+yi(x,y∈R)叫复数a+bi除以复数c+di的商。

运算方法:可以把除法换算成乘法做,在分子分母同时乘上分母的共轭.。所谓共轭你可以理解为加减号的变换,互为共轭的两个复数相乘是个实常数。

复数除法:(a+bi)/(c+di)=((a+bi)/(c+di))*((c-di)/(c-di))=((ac+bd)/(c^2+d^2))+((bc-ad)/(c^2+d^2))i

棣莫佛定理:对于复数z=r(cosθ+isinθ),有z的n次幂为:z^n=r^n*(cosnθ+isinnθ).

这个迭代法会用到这么多公式,每次迭代都会用到多种公式,都是大数运算,即使迭代次数很少,速度也不会太快,消耗时间长,这个怕是不快。
#255
ysr28572021-03-30 22:02
Public Function MbC(D1 As String, D2 As String) As String
Dim X, Y ';两数长度
X = Len(D1) \ 4: Y = Len(D2) \ 4
D3 = String(4 * X + 4 - Len(D1), "0") & D1
D4 = String(4 * Y + 4 - Len(D2), "0") & D2
X = X + 1: Y = Y + 1
Dim A() As String
ReDim A(4 To 4 * X + 4 * Y, 4 To 4 * Y)
Dim I, J, C1, C2, CJ, JW, s, t
For J = 4 * Y To 4 Step -4 ';D2
JW = 0 ';进位清0
C2 = Mid(D4, J - 3, 4) ';每位数
For I = 4 * X To 4 Step -4 ';D1
C1 = Mid(D3, I - 3, 4) ';每位数
CJ = Val(C1) * Val(C2) + JW ';计算乘积
c = I + J: R = 4 * Y + 4 - J
A(c, R) = String(4 - Len(CJ Mod 10000), "0") & CJ Mod 10000 ';本位
JW = CJ \ 10000 ';进位
Next
A(c - 4, R) = JW
Next
Dim B() As String
ReDim B(1 To X + Y)
JW = 0
For s = X + Y To 1 Step -1
Bit = JW
For t = 1 To Y
Bit = Bit + Val(A(4 * s, 4 * t))
Next
B(s) = String(4 - Len(Bit Mod 10000), "0") & Bit Mod 10000
JW = Bit \ 10000
Next
If B(1) > 0 Then
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(1)
Else
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6)
End If
For s = 2 To X + Y
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(s)
Next
End Function

'该程序已经做了修改,是模仿手工计算的程序,采用4位一组,在位数少于5000的时候,此程序居然比快速傅里叶变换的乘法还快!
#256
ysr28572021-03-30 22:03
99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999950000000000000000000000000000000000000000000000001*9=899999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999550000000000000000000000000000000000000000000000009有321位,用时0秒。
#257
ysr28572021-03-30 22:03
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801*
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801=
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601有4888位,用时0.6796875秒。
这比利用快速傅里叶变换的程序还快呢!咋回事?
#258
ysr28572021-03-30 22:08
51444229357009705498695689284160971250193663383685210722150319744748775359122621528344215567083355670451907707693695837668324532850937176166588968634971139183302944833231893556295527896594077197129683597374136482318846544941701249766624000228057981356208443093502034625140604633339848200752173361946073443933346789602235781489339265452071638593776798421165371350248039954188944931286347716381898468113203126395308096792045894764315383795943237773890910465023815013059495056496724871504126056937676152194017082586564255521359261172753102346344494396469595605609421590317944043262260210909685857159849340378368552043197433615054904807889517283559504278373784460368569113363131710769835820089387297714801594555823592854988704942365609400006675160359031426873189564916688157908871243159770851740287846140780388606189695088738739890281656349398834057714656014963811425778390967293708624696915124185083358253535415644842673421215970474230001345828538569798140378601982017699635604641896116818157526044389838198605640572986233402266712761883020099586847825852569572633701763853682554585791118171276290617527340763544892267893370992480349897757098894560281081444642200626464175280985766718573874535680797829930258859640467605975042123111209918827618958945189505091121483858392668384880612255585916669716284514087584598182477078462206558057506025592975910027871273238862247532142535304676640617802030742222960345363855404313399047401003487305799083062451448366617957439158876389882006128158868398932966157003013761952381180690259470099567236607352405809832062578837136250716574574579522256441099557123545025010455224534286356038287679467507270968220021752586057851958248281269629815734877522064508505836721271069799255388491881486092874373981729570391000600273130647608003884599134232877090354958661859302013690470784659120935109719008283905031446377686879466478045757200145506558765235925036276576557385932514483699842243149208969282746209709419000514005516153201916481898006122396813081056743478375585046327305139099481259493354791535353470596487135876104084480625694746373732139586666314758175807030769874378033442682310307356160417978581128218551702424951416328358067700064372855643925169324018021327979713630891489119622752405679286914020988030448289607684851348500009160752114318891422323287600744067214121279440814680222046223856018417356144265724960183154333728716795115561038777021231935282986402700568064230483785799261322243714775230452755725527745146038608379279371001059967865321588174151914448536764775571037973578615327517787408788110985059461002169522785318617192307181693912992506307237500768953476768331681769333002572457840566000897380416071260754878761637173736498974911969752452488135860414907554677006408084497006257159827526348595849150261985348894347311347517189966140266360964227057248211214217659928629919303435391331416005120712207885720558321487799867161206930119103421771539467972103190393682250678522174960152378558439347627175162302619603705648848836071399024952529324687084982408118133017688448503109968656956645896946048480192314682432260264700576584216400878957654828825043888501929204984177904045285658372920051397094163047427295220711030006037232321404778543967047068762469285923373134681085248777362783958346205544202145418889769398157784788073149611548376761403141486538737770037141788493712960577959363480197591519111672946073730752057180868229313890208584096158682612983816343504413873052032480697167353489552278817781586058680359059156908344548036320135631306944489774771528702304735014143703760557177453543349547306529570340616768780151482760598479170615193602006664327138648948903916355739633941308270162516652059915050276438874381771645536407119546307308602110808277470379413233095030335295424468989074162174390506430440009184822224831604762135197176296894482438955676023632858283866605177371220933941389487447042997313276813513817803438354917453446883162229251748984107795718851147870601783924833259787594255023342306507456912443550071030208718860669407813729848666895788392476265844821715329237813888850815099292377748527880672005186227029038313166577070820370953922393125548815784762480716999231112838148069211991950691916501447592610394499065364322013748152127893784838593797607394388436881471937572499635297772411428360587893831743999745591711694693866191043576499340546602519838932679411958977012716186665359051582479709075417158528580483757833679410253083165945296785222695885577370900864071489012430843034944645603735379195280025613435712355924314863811743827795636679833650340711437233826412874652976815458887323384054546632106872673123116398730467840212063933927344401665367273527255946758376081228079255930764904350921454271841369617097419767513579178639155380978815461543065893696532971327449461004174429220963114041363358314967725204392567409853114511718894307643631546965958312484908065383823412217473440414293824284526555873270491143183361295864967579855246996091265048027505060900834170125556562162551537434196084600631467998911190053595844510705466496573548607039396055020292262150204441825829591438698284355118563291933426381855788871060610209574041839838563877291133446841765141550790969420019931335118024135668252727429127277327010080630091503155817732502505948089862964510448572293708413555811826477198946284299249803359083101179231919079840587424089773469686969520331879450331982721475249327999487251751706346378904072199908362843325220090261748886455160894534618900524452334077230251228488177710026608285448160668895830056429900594111638920726702786607673617753884316181608986919842867230781499147892959393862062647527840625613367260491383202053809699049034845359408558078426790922884585937878706447640430037617295337479822942307036309880435190016603292587486670770400968414436062177558340485732399593574684408579852251099386440664715996472709503190326196112431776618496342463773705376557608878531398366891436246005211525105666657143754195682576243436684531565851133669499217182871786042547448128547212489534533546411302123733919227701350343114374027823388734105029451217607019122130451356635147739804673043366197888574741979984899062514977342811387470137829504434138089419313384856038171340813037212988564310965985781906223971603099448077768724135527428122903252985599516402675987118370871380711527621573873393516573976063479848524423462759835964891140012324519173599725428642361361068172851167497848080021674536204331012403670169210980245848637217188648225885977646348516324041545657194185298974033231835117142779160262801229836405621105156783013717293536138550388508105732780981390645713029332581014063684679894314776432826464392770191976441860111883369553100497643960158535828927475846412468513508489123966058178757981628231867323711011231048794489345211468916742191198636966985422920179595657981341141062164406674532648463185396609770870332096252014035092123588963978186735580042580980613737391270774574213143757755751883697069852771105226235745249016819851687618696867463252231114439968978315083108484001519759452354526279002448467845301138631933065317711752431130991417899009156710209089292811908604830563989259580154993086863603158178515104290720648309883842154082224320839725606296732000727693290524485776120935752414418878472294890371499306931907333324291401972007455632345852614250072853013012945436065975597114539565733294131761811647833005562233059897155413908820498684050997196891056374240379032318837109547689273707681611089403544408082721706473290499334235612885568011460256849727085076206079416052803280267260901684609292031897483601056570760086223345132418690406912044967840699532837777220337619001021407001693004319410408897824474243886961978574987768049128885543011697013044774759574717419644216280288616892251878750272403720502483146688505324945767567603316888720316011709842454310651905842456995717854658757793940654403097119500347184685565541435883956074212634458392169744262789777168587077633132878974370677442014549387267164340953922822251829239556879502763379039928986242814762702287157067194761335256675433555182851552352559991526456925347432747802313921075996819327317045132012617429811514074091399778997352474383606992439461610335483557936315809083490277649333569801959919272603011494193988786624013003967741881377298599206260756300231164329090886437111987872720242305957228698555912625065064190559304307358760347745521482896132605885281933616758212828592849681187675942076108113302381355104587574017181942465845495743839422229373653337202363728823896447570459309176646022547055965908445087430566732527561871546926404773102702246224432048449625109060660865222942173680372653073214268518784549567040501706919286193522820203414453082285837784675002393243795648411455249436388354108402298751663579641903923191755243458068049821399981406775187846920082329567089639393166189818386498916654186263236746984358665027637042973344271992431897184463116294348226018092986777330214101355286966888649547882946125231255079867781801266501967591409148337945555826175412217168447872930279389750371330475222596227129424190226136945764125273213822292916011181314116041792889396828595293322573584664017942843601763015910665616185100397070932698993189981899381369135145511919573824148872130362626325230263479916318230804739942853734691756919928756697652976490810473211849549241540762725813953930723190981637783368720629485864681219674862805281147123618369648219443914697265568489851644682338839594389798528686503462752556326463179413487639267322415342021661782198643045709866905617952560578490556995925761572422791790301321190815276469688285495731079969527242665460676072017966646761444343077050015427344485571444722043920393227173574788963017083103163316444721989304354943010481162291435220957200362001334215839785830443382672730119778260821583383111451900319444250424299632477082943256751087979956039788474826051431864034319164099434231538605886844512806083616770766960087352987672015999042087729725781568286209406499243012959626824729965732513083229107853316988026294855503591736817573411617977947178208066444763813946497537177960407804717683672825555900801570001045932685213150713168976874486410808232884111284116849192046563587472241672721878241374262778692543921036556437946028395526409981294253566007077328459635350092391027510311495022125935258197839081781965238971815941968757378341840909860278122918583537172655464084578030518848395326814814456132883655661283681249889602236359262040400558570790171815660578083313993394461197281232297422713635025375641835990588962917099757664795913739285794804584291009040868823532558841628119620925183471868549875466869188177505153666816394414723340641917940584361952079149498472812583260283068474480931678707056484324850617712080359691709776941095013091829445946057432761370542300314779715321334444713774581590337903939304335909307068426671584496871726571881716132948915253704707757591533442524766019672022390979146952076988143810119460236213746430762268682680881266193571871275412676250005946379188555706192188797559909736689205175849641808468634255402172023571037451793254632295935051586694477304538469945188289019295200159220308693052779069996610410807643313071567412266891845626199284108038066722454050607460343612828334672893446961781157291360507072467245161203248910944820605505200092458974605093030860910582001473119924624666059366859402896927689627338088946903630539201357537667544050090484167449839531197820233786114078819811021106435602077046525168822817484701691857941842610951041540933624358100404417526666393254423241305531332656040937125802579759144773272698768734115898512979467030085752261239459124785925303945800057294337283034726565387490196322782696275866332909498542885176995360658669350521506241872044343484849039111278156718242956572497097964273494066835685213469554652278302245504686473612394277905766130772765098235866298788034884139914359215975798397470111738433639102076952796435209264028021537229892074058188314207373272605636038651334696444286919565721890569881338463783989882911019234792486535699025646311275122274411175404155342249234136558802674731197305641190947858045969993105751983395792065828920796822805820210093174577065491814597082131393031622787491679856332477759009694178317375318368821390264654174039670932709831161255202873640489281967716308473047243229957004765412706536236472670869025902543540633101208028807552552098389091790435906088326534470239980054716807416750322521229220241568933467553431576752163460745670475952435493987314007198258850504885411059106007738740875539832452249589294006659624780916723181534511714197062648856491091688501221471717806381749888298525407248789423897932623271498241668092001196586363981364139438871535239207176214827065069539651733601100753810180878379274361295578405732661254466632895143727844665840866498240003655962932105277876459272466979831529282048840956209056998769042430627753436065929805338741393335042911200731019721288387249286505188391256813428739747714333379066876823883520130766201876860791210671538076160347755324700164074813292068568024238519482741252954199964042782225233360037022137076218722706203773213869098586993370170155683791146032975636525838513708976569134302322432642077565826389896215245438300187570310860480000533906713082013024652830860757006343956987254278284858371619486860324713636557288734182121660245924031628622394404845468842376014364491369333932732440011789862081204289182566535179044033371514444457023620546865608494829671941096306770681862607086197624365511249841742601689637943827647739753192488830108748993946646301337601457492499972685876684793341277398602275214653549915139511130070900252357536321474687124983694348062078037402632623766476692775678286881806982898247107838472527399024338405174424815001165897166650159739515463438185108038327958294258499979123263522591261654749484216293043245130713211428672161827666045403900761515335614916042818935205318832501058428630546098253028977703603252002538386142310863661394203801021650102355428530278355411821233551959475904697750988996697656852598884502119976493604708637198826791035572233637351986210864977795898608556238023618301984537915608930604362302527908670790232196653470383452730966437820907710683243209361014219861979941950841987346107743208561925389719631737184861993943843888754529081140961004120569137972767939179238123227568371028391438266058282117268996237434183830334056161593410007851958385930853757794469184653666509613683966762973275802915748207536233835944456492079672432074637652862475003545406240942715300755523944206787863863868182421896839656869884217377578751607363166640679526547616649957166113180795819300698729245904023050382738288763601955657437404388004070623572376563051583388185752588363242342948072258707770222618411368623353933153416998674556673828083953385859553887650200322341613752381777915208516249775540573681407970842264880494895043357543980075647268121681730910097533515842996052774514769117001511705236715668019747243088644998257802328991106887493129666979551568128160024931577019249231036351291752174562619839669581224559705587165708372744726224186073126971717311245980502449125273456503801187274837306224135490894291619763228475986831005594442019148473818854081438056466447549945298051927502134555522991323435490985690831389052274735020726873487488936336741311539022782075508436837487924255181698061213905084162235118210017590721240114251909624811608300914878701408771328813975283269700679765515272835500581808493660164914406678948764808907820590793942802060935667588289909747897748137923192813443141480658391350876193378672782928937239541344428644252704346833459652953893206406021977446066148428686466508087550385252943740960874819825685873233082410626669803645777952677637448050496360102884890873362567118473457647334943807551216752659414686723198905670826134278959453835743722477363868599024571425315726635962538691827224412670447061058393874398485976231917079164327494510859626266588302051504090008261830241447676880203477502787354055343155909715421429375559706133130062628561848592810462408089869178098913629053121350338706001334665817189902339046551719256269486698716494374181056432863341577867140583392107410719128329725480841263789204392440976393893147168046831929228725690454484457819357719649568902018996210157275940520779431450165038526154612104633755692499830669045602271953235366951774644612761172006231769432808233696581070645788729238857402139382484239571166108453915459654362102096518732505237161776583876207193384586878498200605001469543462091485286217093489852123877116301695514263030360771288829090506779042608299705238648514904644323593225819202326098687550889491884085512718311228273159016624975588461535331385403944334397175727312393731559924877557033314268586667576404657042621504624638607780996250155298180711760908316799169764459037945988617689968900369456126826878874149283922399651015788901381482653828757633905291968811496239411234225169841339242923224920997069592927984613452201769764034361265590100376142758102242622751137816624390201799073002914764480438293862303619444424411900873478825309592215448378122673841321459836000301987706900055719812275088409764751071712511442535378273186891677663024136055784679879071700250103941840442827882641509903924818054983813117941436780546475991140251422964511376459380443852419759687830723215798218632573151723785873786668931387512213704069753751304404757469294652741201772267969380591573730352006518268264387324760748171401960363123143642534623196505119663743478694232226992854384052020587978193751769297437110799401666654270086352480363252583084900758706469183711968216421628482651660307315276372014948429733174841247185477453980848109772474843390892942983417487561937787738211071008447243561370883755652297106343676574456572441499153044391296359081444755171879623563709723059551688149772138242004430113752660263595301467681684666765111293583112596306703249487247014559398847582739773923562193048979815510679889238537948008801349956448663808114950270788702178103140036903038677125953796297346185669646277919571450148386833367083965328745661813784675396536308123206255891676600557317868286970806528762125164098195448405530607155298182670078514292122809944389633521146848690175777654805756158929494558044691813620191444798686702502416738793016663859592145359839628493867351786428502743472570771842556696378878472341050391089226772333872594326009783260166152072708644780268603582214015792114037576904183214818892694863534846282524092493194220528298002349242488700100084240660739453383072745053167243114518692729966302221045624162785240731536939992864261703562670127208816099398026935794227709192951849703149047115596988121183064038969430213752390079811597488253736354183223115731539041783376124701639330021544747985885271784834839607317621722963550990654667932700528378860171449142719544032621794550522980007985794164463018892770934144461839455108854280165247825770088985804072882008966279297216038293653289676057511596687371673495287395608114205035151184670802174286673891799830707522027275731687638894711538425640185422616776596308786129781753251068811069644860389343200897476243854920541316146283393481744301776367207189490814060219073419415657802608088338315148976176160344214995925269677377836011427268405733942592393857163978388774692466472603273657739324678810087878647853020613664828824493174871401222712465054920359567267915297137560103994397010364062156242658159355701818701158670419430421561539793933721747077276577835553268786089595585704020376187707801620157668465506675415808792836465976733317453992349443769780601397893341502030028303188671864249117064284001630914762068848485387551204510364030708525634372360381675401963161254572822349974630401有19550位,用时5.6875秒(这个是利用快速傅里叶变换的程序的乘法结果,是两个9775位的整数的积,而那个模仿手工计算的程序显示内存溢出,无法计算和比较了,二者各有优缺点)
#259
ysr28572021-03-30 22:16
可见,利用快速傅里叶变换的乘法计算太复杂,不节约时间,优点是不占用内存,可能利用快速数论变换的乘法好一点,可惜咱不会。
所以,准备采用模仿手工计算的乘法与分治法结合的办法试试。

谢谢各位老师,祝您晚安!
#260
ysr28572021-03-31 12:38
刚学会个分治法程序,验证结果:25*25=625.
代码如下:
'这个程序修改了一下这回应该是对了,123*123=015129,超过4位的乘法就溢出了,由于里面补存了太多的0. 有空再重新考虑吧。
Private Sub Command1_Click()
Dim a, b
Dim ja(), jb()
a = Trim(Text1): b = Trim(Text2): a3 = a: b3 = b
If Len(a) < Len(b) Then
a = String(Len(b) - Len(a), "0") & a
b = b
Else
a = a
b = String(Len(a) - Len(b), "0") & b
End If
x = Len(a) \ 2: y = x + 2
sb = 2 * y
a = String(Val(sb - Len(a)), "0") & a
b = String(Val(sb - Len(b)), "0") & b
x = sb / 2
ReDim ja(1 To x): ReDim jb(1 To x)
For i = 1 To x
ja(i) = Mid(a, 2 * i - 1, 2)
jb(i) = Mid(b, 2 * i - 1, 2)
Next
For i1 = 1 To x
a1 = Mid(ja(i1), 1, 1): a2 = Mid(ja(i1), 2, 1)
For i2 = 1 To x
b1 = Mid(jb(i2), 1, 1): b2 = Mid(jb(i2), 2, 1)
c1 = Val(a1) * Val(b1): c2 = Val(a2) * Val(b2)
c3 = Val(a1) + Val(a2): c4 = Val(b1) + Val(b2)
c5 = Val(c3) * Val(c4)
d1 = Val(c5 - c1 - c2)
d2 = Val(c1 & "00") + Val(d1 & "0") + Val(c2)
d3 = Val(d3 & "00") + Val(d2)
Next
d4 = Val(d4 & "00") + Val(d3)
Next
Text3 = Mid(d4, Len(d4) - Len(a3) - Len(b3) + 1)
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub


[此贴子已经被作者于2021-3-31 23:37编辑过]

#261
ysr28572021-03-31 18:43
我们可以将大整数对拆为两个部分。
即a和b相乘就可以写为:a * b = {  a1 * 10^(n1/2)   + a0  }  *  {  b1 * 10^(n2/2)  +  b0 }

展开后整理得: a  *  b =  a1*b1 * 10^[ (n1+n2)/2 ]   +  a1*b0 * 10^(n1/2)  +   a0*b1 * 10^(n2/2)  + a0*b0 ;这样就容易递归的来求a * b,如果你嫌分解后的数还太大,就可以继续分解
实现方法:我们定义一个支持方法,用于在结束递归时(在本例中,我定义有一个数是1位时结束递归,直接用普通乘法)计算两个字符串的乘积(为了表示大数,用字符串来接受参数)。有 了这个支持方法,分治递归实现两个大数乘法的实现
#262
ysr28572021-04-01 01:08
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801*
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801=
2678145490787694710138406683675886762424440504352140852415040477225326000647575114434084000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048834936179488708027435471556408008440453443428926779725245378240242156111594471823310476577367738661644035731268602062638551083913198940248726780437308391759208187712621288584222894315603010609776256047808203862393934077378322284212996836157946999711091192615345115644564888145602118726225574426254611145656509862440059177850469882535839456536039466435887936245004514758161740268485238639890789236999197352641214190642419864819143872302633183381508060449719040910078119545928583104878680100374223404979294439623863053936852460325863660352138953464283864433479288258329615894013575436244909620398852593573959165209852146723195868414819450095293166474419246068624792251500158729313074813990754243002187726402788255875035147805506073557109594514459440946575807793237757285337705966318084700125854763286763044715974271042543210431566104080946423997787549312368322741085681737642202484344855770671575251802263932602238206558927521452296283997708735179255379729870437018144311078653656921356179379717255889408012373548693171269093189347911767572936354646182280905744653428336130203271833375892051912174249364781089867737031174688851723660162503604698668932069480617343408549167594757806847833186692417853509277050942119328203621782210854822594690811434363298309615524303568070355581209122962278030277005774637857956924214246646048987469444447091104070552021471480435227573710497254610554360378934212162465404707794167300382645889282806308095180237562057359674243409733244490831931049344772061654219722274991982817003747530654442293923699611492166208868103074728942943014030254660718267076074671151915772952154978453283321139817502191891451428025074888093137857848155937369023472576807612843066939653358993279349066730708502953804648726711760241371145448021361674713705239201650905644769500219293676896152881383773233182249705584680154888245917843937168667799346858885231837945440618024916511248385931440602958543262820501974063791697789527953759491166283169241407966207226163326191460372450932044051370230543608342821033473404914121829529590454279123910485652677864764230217322262551731228103618793249634768108819504251685204021169682940059714297096572968426365178022098712842526881685269892119380518399424717940517253783459916522217208335231942121084925515180217597771274533784487863804095664249547028094536853234436994416010805830376423230834237011274973707414073049913128257517631098768469662377613580085684857279852078064471049808506001390599318115347850573917152685295145963307264334360805483089392131468488840686512613378918292927803491310964968936474151927494956717767502696756499701517208075109262341934406482502331252818716359969922837306785955242419168770627555010174863351154399341242232233457270379687646890750322395716028712265386686817398796239601435251412889109101495271260695793700702337565433556822121715587814914939546416648017852596142359775827940200354105961365260177354558828192092060413841135293304399814038242816749559445772646279886702196918742806197182349524180958623098344946102480125559171120395122740471842099684558604610884822932111216853199074776768007834918405075062413588221381655391315218841623755080481394102212121558474742195640527808393537523718723670310899836508493992550359882572122454653849215887390745287805914772137232080736008158427628303158121064565553689542532345804644528894658939608887377827279143521098113972355174011373557722549030347195840504769574273209629932310751597503171061407825884615518048223367691090630514247144551887594035108601695983333346992370597394903524517486860124514674041602443235365127328501568418345710373964098444164115834244922460261107344368735191596460368487577255813303774733776118156247268922022261526312955094802502399373148630398507364969437754278741104640643252194850037020750701584466172422413338145287861330420159965918633476636052486699575826695761237124113609505375040106431777807918125177560371763998256641199099470550367480564755215688490216099359333978962180941400125284442753236570011853188634389108771384375821796093487315084111076120381220996094283323592417209413726042663812262109542726015282249841696703018567110070543728288507529128597875095924358528852936267515439839426131679670901276802163050750126098369347636561857524451706642903292420955569321801425613100890505478610472357490956601092255246041466554317966802293184444182860432246086828700527914016101165025398543989010693124385714424358993377228796856721936384973767950035593026761869617390736082038181438549807436450160416570479922617865403993903012803583520069135616888167827943793870186486907068445有4888位,用时295.377秒(这是由分治法结合我的模仿手工计算的大数乘法程序,做的程序,合4.92295分钟,太浪费时间了,是把300位当一位数做乘法的,可能是我的大数加法和减法程序太慢了,需要改进程序,或者把5000位当作一位做乘法试试,再说吧)
#263
ysr28572021-04-01 02:13
还是把这个代码发一下吧,效率不高,效率太低了:

Private Sub Command1_Click()
Dim a, B
Dim ja(), jb()
a = Trim(Text1): B = Trim(Text2): a3 = a: b3 = B
ts = Timer
If Len(a) < Len(B) Then
a = String(Len(B) - Len(a), "0") & a
B = B
Else
a = a
B = String(Len(a) - Len(B), "0") & B
End If
x = Len(a) \ 300: Y = x + 2
sb = Y * 2
a = String(Val(sb * 300 - Len(a)), "0") & a
B = String(Val(sb * 300 - Len(B)), "0") & B
x = sb / 2
ReDim ja(1 To x): ReDim jb(1 To x)
For I = 1 To x
ja(I) = Mid(a, 600 * I - 599, 600)
jb(I) = Mid(B, 600 * I - 599, 600)
Next
For i1 = 1 To x
a1 = Mid(ja(i1), 1, 300): a2 = Mid(ja(i1), 301, 300)
For i2 = 1 To x
B1 = Mid(jb(i2), 1, 300): b2 = Mid(jb(i2), 301, 300)
C1 = MbC(Trim(a1), Trim(B1)): C2 = MbC(Trim(a2), Trim(b2))
c3 = MPC1(Trim(a1), Trim(a2)): c4 = MPC1(Trim(B1), Trim(b2))
c5 = MbC(Trim(c3), Trim(c4))
D1 = MPC(Trim(c5), Trim(C1)): D1 = MPC(Trim(D1), Trim(C2))
D2 = MPC1(Trim(C1) & String(600, "0"), Trim(D1) & String(300, "0"))
D2 = MPC1(Trim(D2), Trim(C2))
d3 = MPC1(Trim(d3) & String(600, "0"), Trim(D2))
Next
D4 = MPC1(Trim(D4) & String(600, "0"), Trim(d3))
Next
D4 = qqdl(Mid(D4, Len(D4) - Len(a3) - Len(b3) + 1))
Text3 = D4 & "有" & Len(D4) & "位,用时" & Timer - ts & "秒"
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub

Public Function MbC(D1 As String, D2 As String) As String
Dim x, Y ';两数长度
x = Len(D1) \ 4: Y = Len(D2) \ 4
d3 = String(4 * x + 4 - Len(D1), "0") & D1
D4 = String(4 * Y + 4 - Len(D2), "0") & D2
x = x + 1: Y = Y + 1
Dim a() As String
ReDim a(4 To 4 * x + 4 * Y, 4 To 4 * Y)
Dim I, J, C1, C2, CJ, JW, s, t
For J = 4 * Y To 4 Step -4 ';D2
JW = 0 ';进位清0
C2 = Mid(D4, J - 3, 4) ';每位数
For I = 4 * x To 4 Step -4 ';D1
C1 = Mid(d3, I - 3, 4) ';每位数
CJ = Val(C1) * Val(C2) + JW ';计算乘积
c = I + J: r = 4 * Y + 4 - J
a(c, r) = String(4 - Len(CJ Mod 10000), "0") & CJ Mod 10000 ';本位
JW = CJ \ 10000 ';进位
Next
a(c - 4, r) = JW
Next
Dim B() As String
ReDim B(1 To x + Y)
JW = 0
For s = x + Y To 1 Step -1
Bit = JW
For t = 1 To Y
Bit = Bit + Val(a(4 * s, 4 * t))
Next
B(s) = String(4 - Len(Bit Mod 10000), "0") & Bit Mod 10000
JW = Bit \ 10000
Next
If B(1) > 0 Then
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(1)
Else
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6)
End If
For s = 2 To x + Y
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(s)
Next
End Function

'该程序已经做了修改,是模仿手工计算的程序,采用4位一组,在位数少于5000的时候,此程序居然比快速傅里叶变换的乘法还快!

Public Function MPC1(D1 As String, D2 As String) As String 'jiafa
  Dim x, Y, JW '两数长度

If Len(D1) >= Len(D2) Then
  D4 = String(Len(D1) - Len(D2), "0") & D2
  d3 = D1
  Else
  D4 = D2
  d3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  x = Len(d3) \ 8: Y = Len(D4) \ 8
  If 8 * x < Len(d3) Then
  d3 = String(8 * x + 8 - Len(d3), "0") & d3
  D4 = String(8 * Y + 8 - Len(D4), "0") & D4
  x = x + 1: Y = Y + 1
  Else
  x = x: Y = Y
  d3 = d3: D4 = D4
  End If
  Dim a() As String, B1() As String, C1() As String, E1() As String
  ReDim a(1 To x)
  ReDim B1(1 To Y)
  ReDim C1(1 To x)
  ReDim E1(1 To x)
  Dim I, J, C2, CJ
  For J = Y To 1 Step -1 'D2
  JW = 0 '进位清0
  B1(J) = Mid$(D4, J * 8 - 7, 8) '每位数
For I = x To 1 Step -1  'D1
     a(I) = Mid$(d3, I * 8 - 7, 8) '每位数
   C1(I) = Val(a(I)) + Val(B1(I)) + Val(JW) '计算jia
   If Len(C1(I)) < 8 Then
   C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
   Else
   C1(I) = C1(I)
   End If
     JW = Left(C1(I), Len(C1(I)) - 8)
     E1(I) = Right(C1(I), 8)
    Next
    Next
    For r = 1 To x
    If JW = 0 Then
    MPC1 = MPC1 & E1(r)
    Else
    jc = jc & E1(r)
    MPC1 = JW & jc
    End If
    Next
   MPC1 = qqdl(Trim(MPC1))
  End Function
  
  Public Function MPC(D1 As String, D2 As String) As String ';jianfaqi
Dim x, Y ';两数长度
If Len(D1) >= Len(D2) Then
D4 = String(Len(D1) - Len(D2), "0") & D2
d3 = D1
Else
D4 = D2
d3 = String(Len(D2) - Len(D1), "0") & D1
End If
x = Len(d3): Y = Len(D4)
Dim a() As Integer, B1() As Integer, C1() As Integer, E1() As Integer
ReDim a(1 To x)
ReDim B1(1 To Y)
ReDim C1(1 To x)
ReDim E1(1 To x)
Dim I, J, C2, CJ, JW
For J = Y To 1 Step -1 ';D2
JW = 1 ';yu jie weichuzhi
B1(J) = Mid(D4, J, 1) ';每位数
For I = x To 1 Step -1  ';D1
   a(I) = Mid(d3, I, 1) ';每位数
   C1(I) = 10 + a(I) - B1(I) - 1 + JW ';计算jia
   JW = C1(I) \ 10
   E1(I) = C1(I) Mod 10
  Next
  Next
  For r = 1 To x
  MPC = MPC & E1(r)
  For I = 1 To Len(MPC)
    If Not Mid(MPC, I, 1) = "0" Then
        Exit For
    End If
Next
strtmp = Mid(MPC, I)
  If Len(strtmp) = 0 Then
  MPC = "0"
  Else
MPC = strtmp
End If
  Next
  
  
End Function

  
  Private Function qqdl(sa As String) As String

  
  For I = 1 To Len(sa)
    If Not Mid(sa, I, 1) = "0" Then
        Exit For
    End If
Next
strtmp = Mid(sa, I)
  If Len(strtmp) = 0 Then
  qqdl = "0"
  Else
qqdl = strtmp
 End If
End Function
#264
ysr28572021-04-01 03:57
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801*
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801=
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601有4888位,用时35.62598秒(改成4000位当1位了,仍然不快,加减法无法提高速度)
#265
ysr28572021-04-01 03:59
再传一下这个代码:

Private Sub Command1_Click()
Dim a, B
Dim ja(), jb()
a = Trim(Text1): B = Trim(Text2): a3 = a: b3 = B
ts = Timer
If Len(a) < Len(B) Then
a = String(Len(B) - Len(a), "0") & a
B = B
Else
a = a
B = String(Len(a) - Len(B), "0") & B
End If
x = Len(a) \ 4000: Y = x + 2
sb = Y * 2
a = String(Val(sb * 4000 - Len(a)), "0") & a
B = String(Val(sb * 4000 - Len(B)), "0") & B
x = sb / 2
ReDim ja(1 To x): ReDim jb(1 To x)
For I = 1 To x
ja(I) = Mid(a, 8000 * I - 7999, 8000)
jb(I) = Mid(B, 8000 * I - 7999, 8000)
Next
For i1 = 1 To x
a1 = Mid(ja(i1), 1, 4000): a2 = Mid(ja(i1), 4001, 4000)
For i2 = 1 To x
B1 = Mid(jb(i2), 1, 4000): b2 = Mid(jb(i2), 4001, 4000)
C1 = MbC(Trim(a1), Trim(B1)): C2 = MbC(Trim(a2), Trim(b2))
c3 = MPC1(Trim(a1), Trim(a2)): c4 = MPC1(Trim(B1), Trim(b2))
c5 = MbC(Trim(c3), Trim(c4))
D1 = MPC(Trim(c5), Trim(C1)): D1 = MPC(Trim(D1), Trim(C2))
D2 = MPC1(Trim(C1) & String(8000, "0"), Trim(D1) & String(4000, "0"))
D2 = MPC1(Trim(D2), Trim(C2))
d3 = MPC1(Trim(d3) & String(8000, "0"), Trim(D2))
Next
d4 = MPC1(Trim(d4) & String(8000, "0"), Trim(d3))
Next
d4 = qqdl(Mid(d4, Len(d4) - Len(a3) - Len(b3) + 1))
Text3 = d4 & "有" & Len(d4) & "位,用时" & Timer - ts & "秒"
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub

Public Function MbC(D1 As String, D2 As String) As String
Dim x, Y ';两数长度
x = Len(D1) \ 4: Y = Len(D2) \ 4
d3 = String(4 * x + 4 - Len(D1), "0") & D1
d4 = String(4 * Y + 4 - Len(D2), "0") & D2
x = x + 1: Y = Y + 1
Dim a() As String
ReDim a(4 To 4 * x + 4 * Y, 4 To 4 * Y)
Dim I, J, C1, C2, CJ, jw, s, t
For J = 4 * Y To 4 Step -4 ';D2
jw = 0 ';进位清0
C2 = Mid(d4, J - 3, 4) ';每位数
For I = 4 * x To 4 Step -4 ';D1
C1 = Mid(d3, I - 3, 4) ';每位数
CJ = Val(C1) * Val(C2) + jw ';计算乘积
c = I + J: r = 4 * Y + 4 - J
a(c, r) = String(4 - Len(CJ Mod 10000), "0") & CJ Mod 10000 ';本位
jw = CJ \ 10000 ';进位
Next
a(c - 4, r) = jw
Next
Dim B() As String
ReDim B(1 To x + Y)
jw = 0
For s = x + Y To 1 Step -1
Bit = jw
For t = 1 To Y
Bit = Bit + Val(a(4 * s, 4 * t))
Next
B(s) = String(4 - Len(Bit Mod 10000), "0") & Bit Mod 10000
jw = Bit \ 10000
Next
If B(1) > 0 Then
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(1)
Else
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6)
End If
For s = 2 To x + Y
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(s)
Next
End Function

'该程序已经做了修改,是模仿手工计算的程序,采用4位一组,在位数少于5000的时候,此程序居然比快速傅里叶变换的乘法还快!

Public Function MPC1(D1 As String, D2 As String) As String 'jiafa
  Dim x, Y, jw '两数长度

If Len(D1) >= Len(D2) Then
  d4 = String(Len(D1) - Len(D2), "0") & D2
  d3 = D1
  Else
  d4 = D2
  d3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  x = Len(d3) \ 8: Y = Len(d4) \ 8
  If 8 * x < Len(d3) Then
  d3 = String(8 * x + 8 - Len(d3), "0") & d3
  d4 = String(8 * Y + 8 - Len(d4), "0") & d4
  x = x + 1: Y = Y + 1
  Else
  x = x: Y = Y
  d3 = d3: d4 = d4
  End If
  Dim a() As String, B1() As String, C1() As String, E1() As String
  ReDim a(1 To x)
  ReDim B1(1 To Y)
  ReDim C1(1 To x)
  ReDim E1(1 To x)
  Dim I, J, C2, CJ
  For J = Y To 1 Step -1 'D2
  jw = 0 '进位清0
  B1(J) = Mid$(d4, J * 8 - 7, 8) '每位数
For I = x To 1 Step -1  'D1
     a(I) = Mid$(d3, I * 8 - 7, 8) '每位数
   C1(I) = Val(a(I)) + Val(B1(I)) + Val(jw) '计算jia
   If Len(C1(I)) < 8 Then
   C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
   Else
   C1(I) = C1(I)
   End If
     jw = Left(C1(I), Len(C1(I)) - 8)
     E1(I) = Right(C1(I), 8)
    Next
    Next
    For r = 1 To x
    If jw = 0 Then
    MPC1 = MPC1 & E1(r)
    Else
    jc = jc & E1(r)
    MPC1 = jw & jc
    End If
    Next
   MPC1 = qqdl(Trim(MPC1))
  End Function
  
  Public Function MPC(D1 As String, D2 As String) As String ';jianfaqi
  Dim x, Y ';两数长度
If Len(D1) >= Len(D2) Then
  d4 = String(Len(D1) - Len(D2), "0") & D2
  d3 = D1
  Else
  d4 = D2
  d3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  x = Len(d3) \ 8: Y = Len(d4) \ 8
  d3 = String(8 * x + 8 - Len(d3), "0") & d3
  d4 = String(8 * Y + 8 - Len(d4), "0") & d4
  x = x + 1: Y = Y + 1
  
  Dim a() As String, B1() As String, C1() As String, E1() As String
  ReDim a(1 To x)
  ReDim B1(1 To Y)
  ReDim C1(1 To x)
  ReDim E1(1 To x)
  Dim I, J, C2, CJ, jw
  For J = Y To 1 Step -1 ';D2
  jw = 1 ';yu jie weichuzhi
  B1(J) = Mid(d4, J * 8 - 7, 8) ';每位数
For I = x To 1 Step -1  ';D1
     a(I) = Mid(d3, I * 8 - 7, 8) ';每位数
   C1(I) = Val(1 & a(I)) - Val(B1(I)) - Val(1) + Val(jw) ';计算jia
     jw = Left(C1(I), Len(C1(I)) - 8)
     E1(I) = Right(C1(I), 8)
     If Len(E1(I)) < 8 Then
     E1(I) = String(8 - Len(E1(I)), "0") & E1(I)
     Else
     E1(I) = E1(I)
     End If
     
    Next
    Next
    For r = 1 To x
    MPC = MPC & E1(r)
    If Len(MPC) > Len(D1) Then
    MPC = Mid(MPC, Len(MPC) - Len(D1) + 1)
    Else
    MPC = MPC
    End If
    For I = 1 To Len(MPC)
      If Not Mid(MPC, I, 1) = "0" Then
          Exit For
      End If
  Next
  strTmp = Mid(MPC, I)
    If Len(strTmp) = 0 Then
    MPC = "0"
    Else
  MPC = strTmp
  End If
    Next
   
   
  End Function
  
  Private Function qqdl(sa As String) As String

  
  For I = 1 To Len(sa)
    If Not Mid(sa, I, 1) = "0" Then
        Exit For
    End If
Next
strTmp = Mid(sa, I)
  If Len(strTmp) = 0 Then
  qqdl = "0"
  Else
qqdl = strTmp
 End If
End Function
#266
ysr28572021-04-01 13:53
修改了一下程序,结果不对,速度有所提高,咋回事呢?采用倒序计算,从最低位算起,结果倒序输出,减少加法计算量,结果错误,再考虑考虑吧。代码暂时发一下:

Private Sub Command1_Click()
Dim a, B
Dim ja(), jb()
a = Trim(Text1): B = Trim(Text2): a3 = a: b3 = B
ts = Timer
If Len(a) < Len(B) Then
a = String(Len(B) - Len(a), "0") & a
B = B
Else
a = a
B = String(Len(a) - Len(B), "0") & B
End If
x = Len(a) \ 300: Y = x + 2: x11 = x
sb = Y * 2
a = String(Val(sb * 300 - Len(a)), "0") & a
B = String(Val(sb * 300 - Len(B)), "0") & B
x = sb / 2
ReDim ja(1 To x): ReDim jb(1 To x)
For I = 1 To x
ja(I) = Mid(a, Len(a) - 600 * I + 1, 600)
jb(I) = Mid(B, Len(B) - 600 * I + 1, 600)
'倒序输出,减少加法计算量,提高速度
Next
jw2 = 0: jw3 = 0
For i1 = 1 To x
a1 = Mid(ja(i1), 1, 300): a2 = Mid(ja(i1), 301, 300)
d3 = ""
For i2 = 1 To x
B1 = Mid(jb(i2), 1, 300): b2 = Mid(jb(i2), 301, 300)
C1 = MbC(Trim(a1), Trim(B1)): C2 = MbC(Trim(a2), Trim(b2))
c3 = MPC1(Trim(a1), Trim(a2)): c4 = MPC1(Trim(B1), Trim(b2))
c5 = MbC(Trim(c3), Trim(c4))
D1 = MPC(Trim(c5), Trim(C1)): D1 = MPC(Trim(D1), Trim(C2))
D2 = MPC1(Trim(C1) & String(600, "0"), Trim(D1) & String(300, "0"))
D2 = MPC1(Trim(D2), Trim(C2))
If Len(D2) <= 1200 Then
D2 = String(1200 - Len(D2), "0") & D2
jw2 = 0
Else
jw2 = Left(D2, Len(D2) - 1200)
D2 = Right(D2, 1200)
End If
If i1 = x11 - 3 And i2 = x11 - 3 Then
d11 = D2
Else
D2 = D2
End If
d3 = Trim(D2) & Trim(d3)
Next

d5 = d3
Print qqdl(Trim(d5))
x3 = Len(d3) \ 300
If Len(d3) = 300 * x3 Then
d3 = d3
jw3 = 0
Else
jw3 = Left(d3, Len(d3) - 300 * x3)
d3 = Right(d3, 300 * x3)
End If
d4 = Trim(d3) & Trim(d4)
Next

d4 = Trim(d4)
If Len(d4) < 300 Then
d4 = qqdl(Trim(d4))
Else
d4 = qqdl(Mid(d4, Len(d4) - Len(a3) - Len(b3) + 1))
End If
d10 = Mid(d4, 1, 88): d11 = Trim(d11)
Text3 = d4 & "有" & Len(d4) & "位,用时" & Timer - ts & "秒"
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub

Public Function MbC(D1 As String, D2 As String) As String
Dim x, Y ';两数长度
x = Len(D1) \ 4: Y = Len(D2) \ 4
d3 = String(4 * x + 4 - Len(D1), "0") & D1
d4 = String(4 * Y + 4 - Len(D2), "0") & D2
x = x + 1: Y = Y + 1
Dim a() As String
ReDim a(4 To 4 * x + 4 * Y, 4 To 4 * Y)
Dim I, J, C1, C2, CJ, JW, s, t
For J = 4 * Y To 4 Step -4 ';D2
JW = 0 ';进位清0
C2 = Mid(d4, J - 3, 4) ';每位数
For I = 4 * x To 4 Step -4 ';D1
C1 = Mid(d3, I - 3, 4) ';每位数
CJ = Val(C1) * Val(C2) + JW ';计算乘积
c = I + J: r = 4 * Y + 4 - J
a(c, r) = String(4 - Len(CJ Mod 10000), "0") & CJ Mod 10000 ';本位
JW = CJ \ 10000 ';进位
Next
a(c - 4, r) = JW
Next
Dim B() As String
ReDim B(1 To x + Y)
JW = 0
For s = x + Y To 1 Step -1
Bit = JW
For t = 1 To Y
Bit = Bit + Val(a(4 * s, 4 * t))
Next
B(s) = String(4 - Len(Bit Mod 10000), "0") & Bit Mod 10000
JW = Bit \ 10000
Next
If B(1) > 0 Then
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(1)
Else
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6)
End If
For s = 2 To x + Y
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(s)
Next
End Function

'该程序已经做了修改,是模仿手工计算的程序,采用4位一组,在位数少于5000的时候,此程序居然比快速傅里叶变换的乘法还快!

Public Function MPC1(D1 As String, D2 As String) As String 'jiafa
  Dim x, Y, JW '两数长度

If Len(D1) >= Len(D2) Then
  d4 = String(Len(D1) - Len(D2), "0") & D2
  d3 = D1
  Else
  d4 = D2
  d3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  x = Len(d3) \ 8: Y = Len(d4) \ 8
  If 8 * x < Len(d3) Then
  d3 = String(8 * x + 8 - Len(d3), "0") & d3
  d4 = String(8 * Y + 8 - Len(d4), "0") & d4
  x = x + 1: Y = Y + 1
  Else
  x = x: Y = Y
  d3 = d3: d4 = d4
  End If
  Dim a() As String, B1() As String, C1() As String, E1() As String
  ReDim a(1 To x)
  ReDim B1(1 To Y)
  ReDim C1(1 To x)
  ReDim E1(1 To x)
  Dim I, J, C2, CJ
  For J = Y To 1 Step -1 'D2
  JW = 0 '进位清0
  B1(J) = Mid$(d4, J * 8 - 7, 8) '每位数
For I = x To 1 Step -1  'D1
     a(I) = Mid$(d3, I * 8 - 7, 8) '每位数
   C1(I) = Val(a(I)) + Val(B1(I)) + Val(JW) '计算jia
   If Len(C1(I)) < 8 Then
   C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
   Else
   C1(I) = C1(I)
   End If
     JW = Left(C1(I), Len(C1(I)) - 8)
     E1(I) = Right(C1(I), 8)
    Next
    Next
    For r = 1 To x
    If JW = 0 Then
    MPC1 = MPC1 & E1(r)
    Else
    jc = jc & E1(r)
    MPC1 = JW & jc
    End If
    Next
   MPC1 = qqdl(Trim(MPC1))
  End Function
  
  Public Function MPC(D1 As String, D2 As String) As String ';jianfaqi
Dim x, Y ';两数长度
If Len(D1) >= Len(D2) Then
d4 = String(Len(D1) - Len(D2), "0") & D2
d3 = D1
Else
d4 = D2
d3 = String(Len(D2) - Len(D1), "0") & D1
End If
x = Len(d3): Y = Len(d4)
Dim a() As Integer, B1() As Integer, C1() As Integer, E1() As Integer
ReDim a(1 To x)
ReDim B1(1 To Y)
ReDim C1(1 To x)
ReDim E1(1 To x)
Dim I, J, C2, CJ, JW
For J = Y To 1 Step -1 ';D2
JW = 1 ';yu jie weichuzhi
B1(J) = Mid(d4, J, 1) ';每位数
For I = x To 1 Step -1  ';D1
   a(I) = Mid(d3, I, 1) ';每位数
   C1(I) = 10 + a(I) - B1(I) - 1 + JW ';计算jia
   JW = C1(I) \ 10
   E1(I) = C1(I) Mod 10
  Next
  Next
  For r = 1 To x
  MPC = MPC & E1(r)
  For I = 1 To Len(MPC)
    If Not Mid(MPC, I, 1) = "0" Then
        Exit For
    End If
Next
strtmp = Mid(MPC, I)
  If Len(strtmp) = 0 Then
  MPC = "0"
  Else
MPC = strtmp
End If
  Next
  
  
End Function

  
  Private Function qqdl(sa As String) As String

  
  For I = 1 To Len(sa)
    If Not Mid(sa, I, 1) = "0" Then
        Exit For
    End If
Next
strtmp = Mid(sa, I)
  If Len(strtmp) = 0 Then
  qqdl = "0"
  Else
qqdl = strtmp
 End If
End Function



#267
ysr28572021-04-01 13:59
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801*
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801=
7556716882998132164542923842383303327571414587744407945231984628094341180333379645401978298146221777173676638210455520662548991027738258079052809207506367979455512187396178750941853217122840036369548173301141443509525659039575396074833577505735698624489890609009484046476630120285405249920677430746384775952979253571006564333418318770668897295763186676316027596610915791979399362052348545873602726189815157628544498437263477094638977630956320503964273533163977525985300400140163764751336058941588606383095425479304250618575529978192758289990300748777313373507087899169534601600726668909378749370126592359838422617766896228042969975075390204500676572484489708824182046057468895349664773602280104891398380585108251416838593445588941497288478115303823386739577331255231423489957244275591568150461037869725445901546418956914889103837813221378320099880499014018222342116990922975807022360614693772423577680136784695028608731923425362635577892637791161250909792812244592027954144280337652624474895208455219004636193986840747157071695813497353670133362894692860323066270598965217728993062872216962446859880149083503941970770444499514146251481615455355891089694348978517655365203627102239414675972397411451496039654864285237122341394133341081319157681184871278297244162009155204051736252678723531627067376176552401092960678077093159192363721258615551086210244028150778946872428246586904736306135179599862958086659044075873230749180704294097375208200360588668638762246675631994659687469264929730771195942487110722403264491569659580339622212648438009286938036186964260327035986547258357045971407206610058200602976347523999383865181922739913024160534793296729891903147967615939538080017989865056268513503069595234040512868573781901442113016368782879512898505748504409183579871173283353578093561450614128549476113465293704574415350199809211251250302353728078527764868128594701985044655314403219110999833917069459224211041334269362605375995113469525420239566537833097937858386327131046645751788113574013930471792529884065635032884075622869329557621808335521895799476119004142044890500541438620090562777447751130000909261329303878396436455106869987309301666718583989398588040402824951444064856675445842263297685966918041263021893298981796604977071059320967846872380391890840919482170105740880401218296541029907937510519347050358705983480813581986492137042460853498573079916707484770081554855956869530684391567774298463658614816137084323917799849093176582814231633225913372428423612466210856495539187231340411833577632323874451185173706484461285089824749677761305438557387683736749633373462194191976775633764516401358928444089599637462979827649992076227372487021749898755569840643790040608316199074303780130204856698178197753571118083980228264469315246660706720321473549253687080910220500501487604994891438966605534074832231326018970387146996246570463737202606433086961182778844849001549151459537558697657445108792738772557165652345485482618951057319215263186205069899491924395284187132629600286000461015789270135996723652353173805143533305688124977594025230010770089882211898560785574644193383402929807623847693301624433456643569266279784410750311506231805805162412745226642380700372028842246164443649938025561476022865955883606947259158963779126688676889986175227428603703436567638116170043133849291936656904690623124283553087355492033948676552212967127736905505501855837712416837063149720194692245694320135817871886252902554454999030182089183010482460926026947690168320889188735485209971506524057721238700105747521796982564573171184393270521454579264762513733594509697409616756391302852341220656363105077828326475235942495227272462808215747275147924649643843669902443310109365830832741264193175046495485332869920562106492063369720623830846789716831589263346369224538073293014363288540339129863333926625283484042402138365851904313643815634983424873137867698692157231695545218027817983305816414387440463785100729677866814682691502351373917177037485820190796485619422963345167807142587511496461577026086457435543969343350708810722000686828427652591570514157108840527819136387359452422840879204367016189819409995596874905405091387638297607076213318622769748885632707622063680716409692778071196329698635207401142753201301733635684205072848083075932669436885099662905957430651447597481002504602752915074435606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601有4888位,用时8.902344秒(改进版分治法程序结果,总位数对了,最高位数字明显不对,不知道咋错了,再说吧)
#268
ysr28572021-04-01 14:02
速度快的不可靠,算法有错误,超过8000位的乘法,还是用快速傅里叶变换的乘法吧。
#269
ysr28572021-04-01 17:42
没法改进了,可能仅仅末尾600位是对的,其他都不对了,不知道咋改呢。还是用快速傅里叶变换吧,或者用快速数论变换的乘法。(分治法可能还有提升的空间,可能还能改进,改天再考虑吧)

[此贴子已经被作者于2021-4-1 18:54编辑过]

#270
ysr28572021-04-01 20:27
改进了一下,小数值是对的:123456*456789=56393342784有11位,用时0.3046875秒.
#271
ysr28572021-04-01 22:00
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601有4888位,用时17.67188秒(这回可能结果对了,速度不快,不过也算是一种方法)
#272
ysr28572021-04-01 22:03
发一下这个程序供大家参考,欢迎老师探讨沟通和指导帮助!谢谢!
下面是代码:

Private Sub Command1_Click()
Dim a, B
Dim ja(), jb()
a = Trim(Text1): B = Trim(Text2): a3 = a: b3 = B
ts = Timer
If Len(a) < Len(B) Then
a = String(Len(B) - Len(a), "0") & a
B = B
Else
a = a
B = String(Len(a) - Len(B), "0") & B
End If
x = Len(a) \ 300: Y = x + 2: x11 = x
sb = Y * 2
a = String(Val(sb * 300 - Len(a)), "0") & a
B = String(Val(sb * 300 - Len(B)), "0") & B
x = sb / 2
ReDim ja(0 To x - 1): ReDim jb(-x + 1 To x - 1)
For I = 0 To x - 1
ja(I) = Mid(a, Len(a) - 600 * I - 599, 600)
jb(I) = Mid(B, Len(B) - 600 * I - 599, 600)
'倒序输出,减少加法计算量,提高速度
Next
For i0 = -1 To -x + 1 Step -1
jb(i0) = String(600, "0")
Next

jw2 = 0: jw3 = 0
For i1 = 0 To x - 1

d3 = ""
   For i2 = 0 To x - 1
a1 = Mid(ja(i2), 1, 300): a2 = Mid(ja(i2), 301, 300)
B1 = Mid(jb(i1 - i2), 1, 300): b2 = Mid(jb(i1 - i2), 301, 300)
C1 = MbC(Trim(a1), Trim(B1)): C2 = MbC(Trim(a2), Trim(b2))
c3 = MPC1(Trim(a1), Trim(a2)): c4 = MPC1(Trim(B1), Trim(b2))
c5 = MbC(Trim(c3), Trim(c4))
D1 = MPC(Trim(c5), Trim(C1)): D1 = MPC(Trim(D1), Trim(C2))
D2 = MPC1(Trim(C1) & String(600, "0"), Trim(D1) & String(300, "0"))
D2 = MPC1(Trim(D2), Trim(C2))
d3 = MPC1(Trim(D2), Trim(d3))
Print qqdl(Trim(d3))
  Next
  d3 = MPC1(Trim(d3), Trim(jw3))
  d5 = d3
  If Len(d3) <= 600 Then
  jw3 = 0
  Else
  jw3 = Left(d3, Len(d3) - 600)
  End If
  d3 = Right(d3, 600)

d4 = Trim(d3) & Trim(d4)
Next

d4 = Trim(jw3) & Trim(d4)
d4 = qqdl(Trim(d4))
d10 = Mid(d4, 1, 88)
Text3 = d4 & "有" & Len(d4) & "位,用时" & Timer - ts & "秒"
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub

Public Function MbC(D1 As String, D2 As String) As String
Dim x, Y ';两数长度
x = Len(D1) \ 4: Y = Len(D2) \ 4
d3 = String(4 * x + 4 - Len(D1), "0") & D1
d4 = String(4 * Y + 4 - Len(D2), "0") & D2
x = x + 1: Y = Y + 1
Dim a() As String
ReDim a(4 To 4 * x + 4 * Y, 4 To 4 * Y)
Dim I, J, C1, C2, CJ, JW, s, t
For J = 4 * Y To 4 Step -4 ';D2
JW = 0 ';进位清0
C2 = Mid(d4, J - 3, 4) ';每位数
For I = 4 * x To 4 Step -4 ';D1
C1 = Mid(d3, I - 3, 4) ';每位数
CJ = Val(C1) * Val(C2) + JW ';计算乘积
c = I + J: r = 4 * Y + 4 - J
a(c, r) = String(4 - Len(CJ Mod 10000), "0") & CJ Mod 10000 ';本位
JW = CJ \ 10000 ';进位
Next
a(c - 4, r) = JW
Next
Dim B() As String
ReDim B(1 To x + Y)
JW = 0
For s = x + Y To 1 Step -1
Bit = JW
For t = 1 To Y
Bit = Bit + Val(a(4 * s, 4 * t))
Next
B(s) = String(4 - Len(Bit Mod 10000), "0") & Bit Mod 10000
JW = Bit \ 10000
Next
If B(1) > 0 Then
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(1)
Else
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6)
End If
For s = 2 To x + Y
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(s)
Next
End Function

'该程序已经做了修改,是模仿手工计算的程序,采用4位一组,在位数少于5000的时候,此程序居然比快速傅里叶变换的乘法还快!

Public Function MPC1(D1 As String, D2 As String) As String 'jiafa
  Dim x, Y, JW '两数长度
If qqdl(D1) = "0" Then
MPC1 = D2
ElseIf qqdl(D2) = "0" Then
MPC1 = D1
Else
If Len(D1) >= Len(D2) Then
  d4 = String(Len(D1) - Len(D2), "0") & D2
  d3 = D1
  Else
  d4 = D2
  d3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  x = Len(d3) \ 8: Y = Len(d4) \ 8
  If 8 * x < Len(d3) Then
  d3 = String(8 * x + 8 - Len(d3), "0") & d3
  d4 = String(8 * Y + 8 - Len(d4), "0") & d4
  x = x + 1: Y = Y + 1
  Else
  x = x: Y = Y
  d3 = d3: d4 = d4
  End If
  Dim a() As String, B1() As String, C1() As String, E1() As String
  ReDim a(1 To x)
  ReDim B1(1 To Y)
  ReDim C1(1 To x)
  ReDim E1(1 To x)
  Dim I, J, C2, CJ
  For J = Y To 1 Step -1 'D2
  JW = 0 '进位清0
  B1(J) = Mid$(d4, J * 8 - 7, 8) '每位数
For I = x To 1 Step -1  'D1
     a(I) = Mid$(d3, I * 8 - 7, 8) '每位数
   C1(I) = Val(a(I)) + Val(B1(I)) + Val(JW) '计算jia
   If Len(C1(I)) < 8 Then
   C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
   Else
   C1(I) = C1(I)
   End If
     JW = Left(C1(I), Len(C1(I)) - 8)
     E1(I) = Right(C1(I), 8)
    Next
    Next
    For r = 1 To x
    If JW = 0 Then
    MPC1 = MPC1 & E1(r)
    Else
    jc = jc & E1(r)
    MPC1 = JW & jc
    End If
    Next
   MPC1 = qqdl(Trim(MPC1))
   End If
  End Function
  
  Public Function MPC(D1 As String, D2 As String) As String ';jianfaqi
Dim x, Y ';两数长度
If Len(D1) >= Len(D2) Then
d4 = String(Len(D1) - Len(D2), "0") & D2
d3 = D1
Else
d4 = D2
d3 = String(Len(D2) - Len(D1), "0") & D1
End If
x = Len(d3): Y = Len(d4)
Dim a() As Integer, B1() As Integer, C1() As Integer, E1() As Integer
ReDim a(1 To x)
ReDim B1(1 To Y)
ReDim C1(1 To x)
ReDim E1(1 To x)
Dim I, J, C2, CJ, JW
For J = Y To 1 Step -1 ';D2
JW = 1 ';yu jie weichuzhi
B1(J) = Mid(d4, J, 1) ';每位数
For I = x To 1 Step -1  ';D1
   a(I) = Mid(d3, I, 1) ';每位数
   C1(I) = 10 + a(I) - B1(I) - 1 + JW ';计算jia
   JW = C1(I) \ 10
   E1(I) = C1(I) Mod 10
  Next
  Next
  For r = 1 To x
  MPC = MPC & E1(r)
  For I = 1 To Len(MPC)
    If Not Mid(MPC, I, 1) = "0" Then
        Exit For
    End If
Next
strtmp = Mid(MPC, I)
  If Len(strtmp) = 0 Then
  MPC = "0"
  Else
MPC = strtmp
End If
  Next
  
  
End Function

  
  Private Function qqdl(sa As String) As String

  
  For I = 1 To Len(sa)
    If Not Mid(sa, I, 1) = "0" Then
        Exit For
    End If
Next
strtmp = Mid(sa, I)
  If Len(strtmp) = 0 Then
  qqdl = "0"
  Else
qqdl = strtmp
 End If
End Function

#273
ysr28572021-04-02 09:56
把那个模仿手工竖式计算的乘法程序也改为分治法,会怎么样呢?能提供速度吗?有空了试试!
#274
ysr28572021-04-02 23:12
把那个模仿手工竖式计算的乘法程序也改成了分治法,速度不快,模仿手工的方法还是无可替代的。
看来,计算5000位以内的数用模仿手工计算的,超过5000以及1万的用快速傅里叶变换做的乘法程序,超过10万的可以采用分治法和模仿手工计算的乘法程序结合的程序,这样可能会好些。
#275
ysr28572021-04-03 00:10
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801*
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801=
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601有4888位,用时5.391998秒(这个是结合模仿手工计算的分治法乘法程序结果,只是把其中的减法可调用程序改成了8位一组,提高了速度)
#276
ysr28572021-04-03 00:13
下面把改进后的代码发一下:

Private Sub Command1_Click()
Dim a, B
Dim ja(), jb()
a = Trim(Text1): B = Trim(Text2): a3 = a: b3 = B
ts = Timer
If Len(a) < Len(B) Then
a = String(Len(B) - Len(a), "0") & a
B = B
Else
a = a
B = String(Len(a) - Len(B), "0") & B
End If
x = Len(a) \ 300: Y = x + 2: x11 = x
sb = Y * 2
a = String(Val(sb * 300 - Len(a)), "0") & a
B = String(Val(sb * 300 - Len(B)), "0") & B
x = sb / 2
ReDim ja(0 To x - 1): ReDim jb(-x + 1 To x - 1)
For I = 0 To x - 1
ja(I) = Mid(a, Len(a) - 600 * I - 599, 600)
jb(I) = Mid(B, Len(B) - 600 * I - 599, 600)
'倒序输出,减少加法计算量,提高速度
Next
For i0 = -1 To -x + 1 Step -1
jb(i0) = String(600, "0")
Next

jw2 = 0: jw3 = 0
For i1 = 0 To x - 1

d3 = ""
   For i2 = 0 To x - 1
a1 = Mid(ja(i2), 1, 300): a2 = Mid(ja(i2), 301, 300)
B1 = Mid(jb(i1 - i2), 1, 300): b2 = Mid(jb(i1 - i2), 301, 300)
C1 = MbC(Trim(a1), Trim(B1)): C2 = MbC(Trim(a2), Trim(b2))
c3 = MPC1(Trim(a1), Trim(a2)): c4 = MPC1(Trim(B1), Trim(b2))
c5 = MbC(Trim(c3), Trim(c4))
D1 = MPC(Trim(c5), Trim(C1)): D1 = MPC(Trim(D1), Trim(C2))
D2 = MPC1(Trim(C1) & String(600, "0"), Trim(D1) & String(300, "0"))
D2 = MPC1(Trim(D2), Trim(C2))
d3 = MPC1(Trim(D2), Trim(d3))

  Next
  d3 = MPC1(Trim(d3), Trim(jw3))
  d5 = d3
  If Len(d3) <= 600 Then
  jw3 = 0
  Else
  jw3 = Left(d3, Len(d3) - 600)
  End If
  d3 = Right(d3, 600)

d4 = Trim(d3) & Trim(d4)
Next

d4 = Trim(jw3) & Trim(d4)
d4 = qqdl(Trim(d4))
d10 = Mid(d4, 1, 88)
Text3 = d4 & "有" & Len(d4) & "位,用时" & Timer - ts & "秒"
End Sub
Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub

Public Function MbC(D1 As String, D2 As String) As String
Dim x, Y ';两数长度
x = Len(D1) \ 4: Y = Len(D2) \ 4
d3 = String(4 * x + 4 - Len(D1), "0") & D1
d4 = String(4 * Y + 4 - Len(D2), "0") & D2
x = x + 1: Y = Y + 1
Dim a() As String
ReDim a(4 To 4 * x + 4 * Y, 4 To 4 * Y)
Dim I, J, C1, C2, CJ, jw, s, t
For J = 4 * Y To 4 Step -4 ';D2
jw = 0 ';进位清0
C2 = Mid(d4, J - 3, 4) ';每位数
For I = 4 * x To 4 Step -4 ';D1
C1 = Mid(d3, I - 3, 4) ';每位数
CJ = Val(C1) * Val(C2) + jw ';计算乘积
c = I + J: r = 4 * Y + 4 - J
a(c, r) = String(4 - Len(CJ Mod 10000), "0") & CJ Mod 10000 ';本位
jw = CJ \ 10000 ';进位
Next
a(c - 4, r) = jw
Next
Dim B() As String
ReDim B(1 To x + Y)
jw = 0
For s = x + Y To 1 Step -1
Bit = jw
For t = 1 To Y
Bit = Bit + Val(a(4 * s, 4 * t))
Next
B(s) = String(4 - Len(Bit Mod 10000), "0") & Bit Mod 10000
jw = Bit \ 10000
Next
If B(1) > 0 Then
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(1)
Else
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6)
End If
For s = 2 To x + Y
MbC = Val(Left(MbC, 5)) & Mid(MbC, 6) & B(s)
Next
End Function

'该程序已经做了修改,是模仿手工计算的程序,采用4位一组,在位数少于5000的时候,此程序居然比快速傅里叶变换的乘法还快!

Public Function MPC1(D1 As String, D2 As String) As String 'jiafa
  Dim x, Y, jw '两数长度
If qqdl(D1) = "0" Then
MPC1 = D2
ElseIf qqdl(D2) = "0" Then
MPC1 = D1
Else
If Len(D1) >= Len(D2) Then
  d4 = String(Len(D1) - Len(D2), "0") & D2
  d3 = D1
  Else
  d4 = D2
  d3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  x = Len(d3) \ 8: Y = Len(d4) \ 8
  If 8 * x < Len(d3) Then
  d3 = String(8 * x + 8 - Len(d3), "0") & d3
  d4 = String(8 * Y + 8 - Len(d4), "0") & d4
  x = x + 1: Y = Y + 1
  Else
  x = x: Y = Y
  d3 = d3: d4 = d4
  End If
  Dim a() As String, B1() As String, C1() As String, E1() As String
  ReDim a(1 To x)
  ReDim B1(1 To Y)
  ReDim C1(1 To x)
  ReDim E1(1 To x)
  Dim I, J, C2, CJ
  For J = Y To 1 Step -1 'D2
  jw = 0 '进位清0
  B1(J) = Mid$(d4, J * 8 - 7, 8) '每位数
For I = x To 1 Step -1  'D1
     a(I) = Mid$(d3, I * 8 - 7, 8) '每位数
   C1(I) = Val(a(I)) + Val(B1(I)) + Val(jw) '计算jia
   If Len(C1(I)) < 8 Then
   C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
   Else
   C1(I) = C1(I)
   End If
     jw = Left(C1(I), Len(C1(I)) - 8)
     E1(I) = Right(C1(I), 8)
    Next
    Next
    For r = 1 To x
    If jw = 0 Then
    MPC1 = MPC1 & E1(r)
    Else
    jc = jc & E1(r)
    MPC1 = jw & jc
    End If
    Next
   MPC1 = qqdl(Trim(MPC1))
   End If
  End Function
  
  Public Function MPC(D1 As String, D2 As String) As String ';jianfaqi
  Dim x, Y ';两数长度
  If qqdl(D2) = "0" Then
  MPC = D1
  Else
If Len(D1) >= Len(D2) Then
  d4 = String(Len(D1) - Len(D2), "0") & D2
  d3 = D1
  Else
  d4 = D2
  d3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  x = Len(d3) \ 8: Y = Len(d4) \ 8
  d3 = String(8 * x + 8 - Len(d3), "0") & d3
  d4 = String(8 * Y + 8 - Len(d4), "0") & d4
  x = x + 1: Y = Y + 1
  
  Dim a() As String, B1() As String, C1() As String, E1() As String
  ReDim a(1 To x)
  ReDim B1(1 To Y)
  ReDim C1(1 To x)
  ReDim E1(1 To x)
  Dim I, J, C2, CJ, jw
  For J = Y To 1 Step -1 ';D2
  jw = 1 ';yu jie weichuzhi
  B1(J) = Mid(d4, J * 8 - 7, 8) ';每位数
For I = x To 1 Step -1  ';D1
     a(I) = Mid(d3, I * 8 - 7, 8) ';每位数
   C1(I) = Val(1 & a(I)) - Val(B1(I)) - Val(1) + Val(jw) ';计算jia
   If Len(C1(I)) <= 8 Then
   jw = 0
   C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
   Else
     jw = Left(C1(I), Len(C1(I)) - 8)
     End If
     E1(I) = Right(C1(I), 8)
     If Len(E1(I)) < 8 Then
     E1(I) = String(8 - Len(E1(I)), "0") & E1(I)
     Else
     E1(I) = E1(I)
     End If
     
    Next
    Next
    For r = 1 To x
    MPC = MPC & E1(r)
    If Len(MPC) > Len(D1) Then
    MPC = Mid(MPC, Len(MPC) - Len(D1) + 1)
    Else
    MPC = MPC
    End If
    For I = 1 To Len(MPC)
      If Not Mid(MPC, I, 1) = "0" Then
          Exit For
      End If
  Next
  strTmp = Mid(MPC, I)
    If Len(strTmp) = 0 Then
    MPC = "0"
    Else
  MPC = strTmp
  End If
    Next
   End If
   
  End Function



  
  Private Function qqdl(sa As String) As String

  
  For I = 1 To Len(sa)
    If Not Mid(sa, I, 1) = "0" Then
        Exit For
    End If
Next
strTmp = Mid(sa, I)
  If Len(strTmp) = 0 Then
  qqdl = "0"
  Else
qqdl = strTmp
End If
End Function
#277
ysr28572021-04-05 20:32
233333333333333333333333333333333333333333333333333333~233333333333333333333333333333333333333333333333333337之间的素数有1个:(用时26.03906秒)
233333333333333333333333333333333333333333333333333333  (这是54位的素数,实际判断了3个数,平均8秒一个,程序速度提高不少,与高手比起来差距还很大,继续努力吧)
#278
wds12021-04-11 16:15
你的乘法速度慢还可以改进,主要有两点:
1、计算方法问题
   1.1、乘法:对于大数乘法选用模拟竖式累加改进算法就可以,你上文的大数我在VB6在测试0.5秒
   1.2、除法:对于大数除法要用扩位减法运算。
        除法时位数相等直接减;位数不等时,除数尾数补0与被除数扩至等位在做减法,缩1位差一个数量级,除数被除数位差越大效率差别也越大。
2、计算变量问题
   对于计算机程序,数值运算速度远远大于字符运算,因此算法应该修改为直接计算long型数组,而不是分解和计算计算字串
3、参考1【16进制数组乘法】【结果返回也是数组型:p1p2=Prime1*Prime2,高位在前】
'==================================================================================
'=                  大数乘法(16进制)--模拟乘法累加算法                            =
'==================================================================================
Public Sub Mult(ByVal Prime1, ByVal Prime2, ByRef P1P2)
  maxa = UBound(Prime1)
  maxb = UBound(Prime2)
  maxc = maxa + maxb + 1
  ReDim P1P2(maxc) As Long '分配存储结果变量P1P2
  For I = 0 To maxa   '不考虑进位的竖式乘法运算
    For J = 0 To maxb 'Prime1的i位与Prime2的j位相乘结果存放在i+j+1位
      P1P2(I + J + 1) = P1P2(I + J + 1) + Prime1(I) * Prime2(J) '(第一位给进位保留)
    Next
  Next
  For k = maxc To 1 Step -1 '单独处理进位
    If P1P2(k) > 256 Then
      P1P2(k - 1) = P1P2(k - 1) + Int(P1P2(k) / 256) '处理进位
      P1P2(k) = P1P2(k) Mod 256                      '处理尾数
    End If
  Next
  If P1P2(0) = 0 Then '去除进位0,没产生进位去掉全面的0。不去也行弄成字符串了,在处理也行
    For I = 1 To maxc: P1P2(I - 1) = P1P2(I): Next
    ReDim Preserve P1P2(maxc - 1)
  End If
End Sub  
4、参考2【最大公约数】【欧几里得算法-递归实现】网上C现成的,简单改一下就成了。
Function Gcd(e, Orla) As Long
  If Orla = 0 Then
    Gcd = e
  Else
    Gcd = Gcd(Orla, e Mod Orla)
  End If
End Function

[此贴子已经被作者于2021-4-11 16:43编辑过]

#279
ysr28572021-04-11 21:04
回复 278楼 wds1
谢谢您!
没有试过您的方法,学习一下。
我说咋速度也提不上去,还有这个方法,谢谢!
#280
ysr28572021-04-11 21:20
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801*
51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801=
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601有4888位,用时0.6796875秒。
(这是我的模仿手工竖式乘法程序的结果,是4位一组(当一个字符)的程序,这比利用快速傅里叶变换的程序还快呢)
#281
wds12021-04-12 11:07
对于大数运算的算法,建议考虑位长和变量类型时,在参考java的系统算法(摘取):

1、Java 7 里面,就是用二重循环直接乘的,复杂度为O(n^2)。源代码:[BigInteger - Java71] (见1165行)
2、Java 8 里面,根据两个因数的大小,有三种乘法。源代码:[BigInteger - Java8] (见1464行):
   2.1、当两个因数均小于 2^(32 × 80)时,用二重循环直接相乘,复杂度为 O(n^2)
   2.2、当两个因数均小于 2^(32 × 240)时,采用 Karatsuba algorithm,复杂度为 O(n^(log2 3)≈O(n^1.585)
   2.3、否则,采用 Toom-Cook multiplication,其复杂度为 O( n^(log3 5) ≈ O(n^1.465)
3、根据java系统的算法分析,如果4096以下优选算法1、4096-8192的优选算法2、大于8192的优选算法3
#282
ysr28572021-04-12 16:41
回复 281楼 wds1
额,谢谢!
Karatsuba algorithm和Toom-Cook multiplication是啥?我不会,勉强算是弄出来快速傅里叶变换的乘法程序,和分治法乘法程序。
#283
wds12021-04-12 17:32
Karatsuba和Toom-Cook都是分治算法,只不过第一个是简单的分治算法
 
Karatsuba的原理:
  1、2位数乘法(ac,高位,bd低位):ab*cd=(a*10+b)*(c*10+d)=ac*100+(a*d+b∗c)*10+bd
  只要计算ac, bd, (a+b)*(c+d)三个数值,之后ac后面补2个0,bd不补,(a+b)*(c+d)后面补1个0
  2、3,4位数乘法(ac,高位,bd低位):
    ab*cd=(a*100+b)*(c*100+d)=ac*10000+(a*d+b∗c)*100+bd,与上面相比就是补的0不一样
  
   以上算法向当时把乘积位减半运算,如果是16位数的乘法一样适用。。
  
#284
ysr28572021-04-12 18:14
回复 283楼 wds1
额,谢谢!明白了一点,我用的分治法怎么不能提高速度反而降低了?
#285
wds12021-04-12 18:54
分治的核心是降低运算次数,但还有一点,那就是你的拆分是否合理。

例如:8000字节的10进制数据
1、如果将10进制转为16进制,那么大约可以减少2000字节的乘法运算量
1、拆分为8000个byte,那么n是8000,乘法计算量为O(8000^2)
2、拆分为4000个integer,  那么n是4000,乘法计算量为O(4000^2)
3、差分为2000个long,那么n是2000,,乘法计算量为O(2000^2)

另外,大数算法还和编程语言有关,对于支持大数数据类型和运算的系统速度就会快,因为他有专用的大数函数。


[此贴子已经被作者于2021-4-12 21:22编辑过]

#286
ysr28572021-04-12 20:47
回复 285楼 wds1
谢谢!我不会用16进制的算法,您的方法我还要好好学习,非常感谢!
我再看看前面的程序如何优化和修改,哈哈,学到不少,谢谢!
#287
ysr28572021-04-12 20:53
高手编程的暴力乘法程序,就是快,下面是运行结果:

51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801*
 51750801837147361345408953922231823615475578427966187002956389087112242842559611794590895524485015222232340190036677951157401229518412775512617768569186939216558814320044037671525512763073762127357272238470370174050144130962253437215369727381909754581075278888137687950749577751967083233227932391898438489520107788418593104216764745143648165875043861634459264809523254076330115365651752264033578829280651927862062277153553168278640509846511729608378923480331705134467105387853440058108864733429085916392927954109944314725590758950098556991513109760871599045355054258610189920009222629391227784118536578933067532162200768112408111142115021110731900107445187734955403922470144187293970602024056652942406064101184615113779243566842311336047149767396006622923831778833173731302325162741660053390002572456069410383734906953419854919650114722834689335022576764661864630532595250136417800041415827379233503655173380741283758557001102498493237113089198106283487003030225058520047964863929279622015825870972146222540614667928697270131499340362072956956518213266361286372027834000838185920579641835952404678850816456467012890793914108776148483471455515695596694573035435841962871983614397882366460940068418989292218104650923374259244879331938925143014431488635252724366437874702141802712286424754174951797598162531093933772708024046029028652425912112434874797404878317364682580259997737809632860143160557722236459697738869857870982308547756781808568834445404196611833859447257611721058384661943492980180884154939581533269700568975940675513953240040220315659784214936947443784598154082110443748171557676558299300252057475022409541083454882202785077569281268346332901357829843950754331120530978456454396022570647840977328115888711408099894489014427119253061839770890965114853246067272044090282103668762164047374624856119676063310166566519499552342907590495696658359542582469176737197423550084705962160477441546453931948920780829433665262356431973422034925001341330921812806939990688094288773216182971976433480031438271163051341645350474631300965486818841553843112688792803367397276204832936049162335586140151875524537720425345701193713093955432559579831822084761702059241698184717469616732582600658006352069963017377661059372648121969448644394344799369193952197519795756182552461838014896498816263546256621347748100920475049252091842372001283217811864786225692344297842649982716736752004086642881662614773154743879410328420184057019873899911520017723788801=
 000002678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601用时0.15625秒,有4893位(前面多了5位前导0)
#288
ysr28572021-04-12 20:57
我稍加修改,变成了可调用程序,发一下代码:(原代码是在另一个论坛的《[讨论]关于大整数运算》一文中见到的)

Public Function MbC(D1 As String, D2 As String) As String
 Dim j1&, j2&, e&, d&, e1&

    ' 按列法计算C=A*B
 m = Trim(D1): n = Trim(D2)
 X = Len(m) \ 4: Y = Len(n) \ 4
 m = String(4 * X + 4 - Len(m), "0") & m
 n = String(4 * Y + 4 - Len(n), "0") & n
 X = X + 1: Y = Y + 1
 Dim A(), B()
 ReDim A(1 To X): ReDim B(1 To Y)
 For i1 = 1 To X
 A(i1) = Mid(m, i1 * 4 - 3, 4)
 Next
 For i2 = 1 To Y
 B(i2) = Mid(n, i2 * 4 - 3, 4)
 Next
 ma = X: mb = Y
     MC = ma + mb
     ReDim c(MC)
     e1 = 0
     j1 = ma: j2 = ma
     For I = MC To 2 Step -1
         If I <= ma Then j2 = I - 1
         e = e1: e1 = 0
         For J = j1 To j2
             e = e + A(J) * B(I - J)
             If e > 2040000000 Then '减少进位次数
                e = e - 2040000000
                 e1 = e1 + 204000
             End If
         Next J

         If j1 > 1 Then j1 = j1 - 1
 base = 10000
         d = e \ base
         c(I) = e - d * base
         If Len(c(I)) < 4 Then
         c(I) = String(4 - Len(c(I)), "0") & c(I)
         Else
         c(I) = c(I)
         End If
 jc = c(I) & jc
         e1 = e1 + d
     Next I
     jc = d & jc
    MbC = jc
 End Function

[此贴子已经被作者于2021-4-14 19:03编辑过]

#289
ysr28572021-04-12 21:06
回复 288楼 ysr2857
其中的减少进位次数的程序有啥作用,能不能起作用?看不懂,是否影响速度,还是能提高速度?
#290
wds12021-04-12 22:59
上面的算法已经可以了,用的是4位数乘法。
1、速度方面,我稍微改了一下,0.046s完成乘法,改进如下:
   将以下语句修改后,,速度提高了1倍以上  
   A(i1) = Mid(m, i1 * 4 - 3, 4)
   B(i2) = Mid(n, i2 * 4 - 3, 4)
   改为:
   A(i1) = val(Mid(m, i1 * 4 - 3, 4))
   B(i2) = val(Mid(n, i2 * 4 - 3, 4))
2、多0是由于凑4位补0造成
   增加补0的计数:b0 = 4 * x + 4 - Len(m),在这个语句前   m = String(4 * X + 4 - Len(m), "0") & m
   在最后去掉补的前缀0:MbC = Mid(jc, b0, Len(jc) - b0 + 1)
#291
ysr28572021-04-13 00:17
回复 290楼 wds1
谢谢您的指导和改进,我再试试,哈哈,学习了!
非常感谢,祝晚安1
#292
ysr28572021-04-13 00:55
回复 290楼 wds1
改进后速度提高了,仍然有2个前导0,直接加了个去掉前导0的程序,结果如下:
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601用时2.612305E-02秒,有4888位(改进后速度提高不少)
#293
ysr28572021-04-13 18:26
'如下为利用快速傅里叶变换的大数乘法的可调用程序,咋比模仿手工乘法的程序还慢呢,如何优化?

Private Sub Command1_Click()
Dim m, n
m = Trim(Text1): n = Trim(Text2)
ts = Timer
c = MbC4(Trim(m), Trim(n))
Text3 = c & "用时" & Timer - ts & "秒,有" & Len(c) & "位"
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub

Public Function MbC4(D1 As String, D2 As String) As String '快速乘法
        Dim l As Long, le As Long, le1 As Long, n As Long, r As Long, p As Long, q As Long, m As Byte
  Dim wr As Double, w1 As Double, wlr As Double, wl1 As Double, tr As Double, t1 As Double
  Dim pi As Double, t As Double, tr1 As Double
        
  
Dim xr() As Double, a As String
  a = Trim(D1)
  B = Trim(D2)
  
  X = Len(a) \ 4: Y = Len(B) \ 4
  a = String(Val(X * 4 + 4 - Len(a)), "0") & a
  B = String(Val(Y * 4 + 4 - Len(B)), "0") & B
  X = X + 1: Y = Y + 1
  sb1 = X + Y
  sb2 = Log(sb1) / Log(2)
  If InStr(sb2, ".") = 0 Then
  sb2 = sb2
  Else
  sb2 = Int(sb2) + 1
  End If
  sb = 2 ^ sb2
  a = String(Val(sb) * 4 - Len(a), "0") & a
  B = String(Val(sb) * 4 - Len(B), "0") & B
  
   ReDim x_(1 To sb): ReDim y_(1 To sb)
    For i1 = 1 To sb
    x_(i1) = Mid(a, (sb - i1 + 1) * 4 - 3, 4): y_(i1) = Mid(B, (sb - i1 + 1) * 4 - 3, 4)
    If Len(x_(i1)) < 4 Then
    x_(i1) = String(4 - Len(x_(i1)), "0") & x_(i1)
    ElseIf Len(y_(i1)) < 4 Then
    y_(i1) = String(4 - Len(y_(i1)), "0") & y_(i1)
    Else
    x_(i1) = x_(i1): y_(i1) = y_(i1)
    End If
   
      Next
    Dim I As Long, J As Long, mn As Long, lh As Long, k As Long
    '位序倒置
n = sb '求数组大小,其值必须是2的幂
lh = n / 2
    J = n / 2
    For I = 1 To n - 2


    Debug.Print I, J
    k = lh '下面是向右进位算法
Do
    If k > J Then Exit Do '高位是1吗
J = J - k '是的,高位置0
    k = k / 2 '准备次高位的权
Loop Until k = 0 '次高位的权若非0,则检查新的次高位
J = J + k '非则若最高位是0,则置1
    s = s & x_(J + 1)
    s1 = s1 & y_(J + 1)
    Next
    a = x_(1) & x_(1 + sb / 2) & s
    B = y_(1) & y_(1 + sb / 2) & s1
  
  ReDim xr(0 To (Len(a) - 4) \ 4): ReDim yr(0 To (Len(B) - 4) \ 4): ReDim zr(0 To (Len(B) - 4) \ 4)
  If Len(a) = 4 Then
  xr(0) = a: yr(0) = B
  Else
  For i1 = 0 To (Len(a) - 4) \ 4
  xr(i1) = Mid(a, (i1 + 1) * 4 - 3, 4)
  yr(i1) = Mid(B, (i1 + 1) * 4 - 3, 4)

     Next
     End If
  
  Dim xi(): Dim yi(): Dim zi()
  n = sb '求数组大小,其值必须是2的幂
m = 0
  l = 2
  pi = 3.14159265358979
  Do
  l = l + l
  m = m + 1
  Loop Until l > n
  n = l / 2
  ReDim xi(n - 1): ReDim yi(n - 1): ReDim zi(n - 1)

  l = 1
  Do
    le = 2 ^ l
    le1 = le / 2
    wr = 1
    wi = 0
    If l = 1 Then
    t = 0
    Else
    t = pi / le1
    End If
    w1r = Cos(t)
    w1i = -Sin(t)
    r = 0
  Do
    p = r
    Do
     q = p + le1
     
     tr = xr(q) * wr - xi(q) * wi
     ti = xr(q) * wi + xi(q) * wr
     tr1 = yr(q) * wr - yi(q) * wi
     ti1 = yr(q) * wi + yi(q) * wr
     
     
     xr(q) = xr(p) - tr
     xi(q) = xi(p) - ti
     xr(p) = xr(p) + tr
     xi(p) = xi(p) + ti
     
       yr(q) = yr(p) - tr1
      yi(q) = yi(p) - ti1
      yr(p) = yr(p) + tr1
      yi(p) = yi(p) + ti1
     xr(p) = Format(Val(xr(p)), "0.000000"): xi(p) = Format(Val(xi(p)), "0.000000")
     yr(p) = Format(Val(yr(p)), "0.000000"): yi(p) = Format(Val(yi(p)), "0.000000")
     
      p = p + le
  Loop Until p > n - 1


  wr2 = wr * w1r - wi * w1i
  wi2 = wr * w1i + wi * w1r
  wr = wr2
  wi = wi2
  r = r + 1
  Loop Until r > le1 - 1
  l = l + 1
  Loop Until l > m

  For I = 0 To n - 1 '仅输出模
   zr(I) = xr(I) * yr(I) - xi(I) * yi(I): zi(I) = xr(I) * yi(I) + xi(I) * yr(I)
    zr(I) = Format(Val(zr(I)), "0.000000"): zi(I) = Format(Val(zi(I)), "0.000000")
  

      's = s & "/" & zr(I)
      's1 = s1 & "/" & zi(I)
      Next
      
       J = sb
     
       ReDim x_(1 To sb): ReDim y_(1 To sb)
     For k = 1 To J
         n1 = n1 + 1
          ReDim Preserve x_(1 To n1)
        
         x_(n1) = zr(n1 - 1): y_(n1) = zi(n1 - 1)
         x_(n1) = Format(Val(x_(n1)), "0.000000"): y_(n1) = Format(Val(y_(n1)), "0.000000")
         
       Next
   
    '位序倒置
n = sb '求数组大小,其值必须是2的幂
lh = n / 2
    J = n / 2
   
    For I = 1 To n - 2


    Debug.Print I, J
    k = lh '下面是向右进位算法
Do
    If k > J Then Exit Do '高位是1吗
J = J - k '是的,高位置0
    k = k / 2 '准备次高位的权
Loop Until k = 0 '次高位的权若非0,则检查新的次高位
J = J + k '非则若最高位是0,则置1

xr(I + 1) = x_(J + 1): yr(I + 1) = y_(J + 1)
    js = js & "/" & x_(J + 1)
    js1 = js1 & "/" & y_(J + 1)
    Next
    sx1 = "/" & x_(1) & "/" & x_(1 + sb / 2) & js
    sy1 = "/" & y_(1) & "/" & y_(1 + sb / 2) & js1
   xr(0) = x_(1): xr(1) = x_(1 + sb / 2)
   yr(0) = y_(1): yr(1) = y_(1 + sb / 2)
   
   
   ns = Len(a) \ 4: Jn = ns
  
      
  

  ReDim zr(0 To ns - 1)

  m = 0
  l = 2
  pi = 3.14159265358979
  Do
  l = l + l
  m = m + 1
  Loop Until l > ns
  ns = l / 2
  ReDim xi(ns - 1): ReDim yi(ns - 1): ReDim zi(ns - 1)

  l = 1
  Do
    le = 2 ^ l
    le1 = le / 2
    wr = 1
    wi = 0
    If l = 1 Then
    t = 0
    Else
    t = -1 * pi / le1
    End If
    w1r = Cos(t)
    w1i = -Sin(t)
    r = 0
  Do
    p = r
    Do
     q = p + le1
     
     tr = xr(q) * wr - xi(q) * wi
     ti = xr(q) * wi + xi(q) * wr
     tr1 = yr(q) * wr - yi(q) * wi
     ti1 = yr(q) * wi + yi(q) * wr
     
     
     xr(q) = xr(p) - tr
     xi(q) = xi(p) - ti
     xr(p) = xr(p) + tr
     xi(p) = xi(p) + ti
     
       yr(q) = yr(p) - tr1
      yi(q) = yi(p) - ti1
      yr(p) = yr(p) + tr1
      yi(p) = yi(p) + ti1
     xr(p) = Format(Val(xr(p)), "0.000000"): xi(p) = Format(Val(xi(p)), "0.000000")
     yr(p) = Format(Val(yr(p)), "0.000000"): yi(p) = Format(Val(yi(p)), "0.000000")
      p = p + le
  Loop Until p > ns - 1


  wr2 = wr * w1r - wi * w1i
  wi2 = wr * w1i + wi * w1r
  wr = wr2
  wi = wi2
  r = r + 1
  Loop Until r > le1 - 1
  l = l + 1
  Loop Until l > m

  For I = 0 To ns - 1 '仅输出模
zr(I) = (xr(I) - yi(I)) / n
      zr(I) = Format(Val(zr(I) + 0.5), "0.000000")
     If InStr(zr(I), ".") = 0 Then
     s121 = zr(I)
     Else
     s121 = Left(zr(I), InStr(zr(I), ".") - 1)
      End If
      s0 = "/" & s121 & s0
      zr(I) = s121
      Next
      For i1 = 1 To Val(Jn - sb1 + 1)
      zr(sb1 + i1 - 2) = 0
      Next
      
     
     
      For i1 = 0 To n - 1
      If zr(i1) < 0 Then
      zr(i1) = "0000"
      ElseIf Len(zr(i1)) < 4 Then
      zr(i1) = String(4 - Len(zr(i1)), "0") & zr(i1)
      Else
      zr(i1) = zr(i1)
      End If
      
      's5 = s5 & "/" & zr(i1)
      
      If i1 = 0 Then
      
      s6 = Val(Left(zr(i1), Len(zr(i1)) - 4))
      If Len(s6) < 4 Then
      s6 = String(4 - Len(s6), "0") & s6
      Else
      s6 = s6
      End If
      s8 = Right(zr(i1), 4)
      ElseIf Val(zr(i1)) >= 0 Then
      s7 = Val(zr(i1)) + Val(s6)
    If Len(s7) = 4 Or Len(s7) = 8 Or Len(s7) = 12 Then
          s7 = s7
          Else
          s7 = String(16 - Len(s7), "0") & s7
         End If
      s10 = Right(s7, 4)
      s11 = s10 & s11
      If Len(s7) < 4 Then
      s7 = String(4 - Len(s7), "0") & s7
      ElseIf Len(s7) = 4 Then
      s6 = "0000"
      Else
      s7 = s7
      s6 = Val(Left(s7, Len(s7) - 4))
      End If
      Else
      s6 = s6
      End If
     
      Next
      s9 = s6 & s11 & s8
     
   
   s9 = qdqd0(Trim(s9))   
      
     's2 = nifft(dxcx1(Trim(s)), dxcx1(Trim(s1)), Trim(sb1))
     
     's3 = nifft(Trim(sx1), Trim(sy1), Trim(sb1))
      MbC4 = s9
  End Function

  Private Function qdqd0(sa As String) As String
  a = sa
  Do While Left(a, 1) = "0"
  a = Mid(a, 2)
  Loop
  If a = "" Then
  a = 0
  Else
  a = a
  End If
  qdqd0 = a
  End Function


[此贴子已经被作者于2021-5-4 18:45编辑过]

#294
ysr28572021-04-13 18:59
'如下为前面这个利用快速傅里叶变换的乘法程序,稍加调整,仅仅提高了100毫秒的速度,咋优化呢?

Private Sub Command1_Click()
Dim m, n
m = Trim(Text1): n = Trim(Text2)
ts = Timer
c = MbC4(Trim(m), Trim(n))
Text3 = c & "用时" & Timer - ts & "秒,有" & Len(c) & "位"
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub

Public Function MbC4(D1 As String, D2 As String) As String '快速乘法
        Dim l As Long, le As Long, le1 As Long, n As Long, r As Long, p As Long, q As Long, m As Byte
  Dim wr As Double, w1 As Double, wlr As Double, wl1 As Double, tr As Double, t1 As Double
  Dim pi As Double, t As Double, tr1 As Double
        
  
Dim xr() As Double, a As String
  a = Trim(D1)
  B = Trim(D2)
  
  X = Len(a) \ 4: Y = Len(B) \ 4
  a = String(Val(X * 4 + 4 - Len(a)), "0") & a
  B = String(Val(Y * 4 + 4 - Len(B)), "0") & B
  X = X + 1: Y = Y + 1
  sb1 = X + Y
  sb2 = Log(sb1) / Log(2)
  If InStr(sb2, ".") = 0 Then
  sb2 = sb2
  Else
  sb2 = Int(sb2) + 1
  End If
  sb = 2 ^ sb2
  a = String(Val(sb) * 4 - Len(a), "0") & a
  B = String(Val(sb) * 4 - Len(B), "0") & B
  
   ReDim x_(1 To sb): ReDim y_(1 To sb)
    For i1 = 1 To sb
    x_(i1) = Mid(a, (sb - i1 + 1) * 4 - 3, 4): y_(i1) = Mid(B, (sb - i1 + 1) * 4 - 3, 4)
    If Len(x_(i1)) < 4 Then
    x_(i1) = String(4 - Len(x_(i1)), "0") & x_(i1)
    ElseIf Len(y_(i1)) < 4 Then
    y_(i1) = String(4 - Len(y_(i1)), "0") & y_(i1)
    Else
    x_(i1) = x_(i1): y_(i1) = y_(i1)
    End If
   
      Next
      ReDim xr(0 To (Len(a) - 4) \ 4): ReDim yr(0 To (Len(B) - 4) \ 4): ReDim zr(0 To (Len(B) - 4) \ 4)
      
       If Len(a) = 4 Then
  xr(0) = a: yr(0) = B
  Else
    Dim I As Long, J As Long, mn As Long, lh As Long, k As Long
    '位序倒置
n = sb '求数组大小,其值必须是2的幂
lh = n / 2
    J = n / 2
    For I = 1 To n - 2


    Debug.Print I, J
    k = lh '下面是向右进位算法
Do
    If k > J Then Exit Do '高位是1吗
J = J - k '是的,高位置0
    k = k / 2 '准备次高位的权
Loop Until k = 0 '次高位的权若非0,则检查新的次高位
J = J + k '非则若最高位是0,则置1
   xr(I + 1) = x_(J + 1): yr(I + 1) = y_(J + 1)
    Next
    xr(0) = x_(1): xr(1) = x_(1 + sb / 2)
    yr(0) = y_(1): yr(1) = y_(1 + sb / 2)
  
     End If
  
  Dim xi(): Dim yi(): Dim zi()
  n = sb '求数组大小,其值必须是2的幂
m = 0
  l = 2
  pi = 3.14159265358979
  Do
  l = l + l
  m = m + 1
  Loop Until l > n
  n = l / 2
  ReDim xi(n - 1): ReDim yi(n - 1): ReDim zi(n - 1)

  l = 1
  Do
    le = 2 ^ l
    le1 = le / 2
    wr = 1
    wi = 0
    If l = 1 Then
    t = 0
    Else
    t = pi / le1
    End If
    w1r = Cos(t)
    w1i = -Sin(t)
    r = 0
  Do
    p = r
    Do
     q = p + le1
     
     tr = xr(q) * wr - xi(q) * wi
     ti = xr(q) * wi + xi(q) * wr
     tr1 = yr(q) * wr - yi(q) * wi
     ti1 = yr(q) * wi + yi(q) * wr
     
     
     xr(q) = xr(p) - tr
     xi(q) = xi(p) - ti
     xr(p) = xr(p) + tr
     xi(p) = xi(p) + ti
     
       yr(q) = yr(p) - tr1
      yi(q) = yi(p) - ti1
      yr(p) = yr(p) + tr1
      yi(p) = yi(p) + ti1
     xr(p) = Format(Val(xr(p)), "0.000000"): xi(p) = Format(Val(xi(p)), "0.000000")
     yr(p) = Format(Val(yr(p)), "0.000000"): yi(p) = Format(Val(yi(p)), "0.000000")
     
      p = p + le
  Loop Until p > n - 1


  wr2 = wr * w1r - wi * w1i
  wi2 = wr * w1i + wi * w1r
  wr = wr2
  wi = wi2
  r = r + 1
  Loop Until r > le1 - 1
  l = l + 1
  Loop Until l > m

  For I = 0 To n - 1 '仅输出模
   zr(I) = xr(I) * yr(I) - xi(I) * yi(I): zi(I) = xr(I) * yi(I) + xi(I) * yr(I)
    zr(I) = Format(Val(zr(I)), "0.000000"): zi(I) = Format(Val(zi(I)), "0.000000")
  

      's = s & "/" & zr(I)
      's1 = s1 & "/" & zi(I)
      Next
      
       J = sb
     
       ReDim x_(1 To sb): ReDim y_(1 To sb)
     For k = 1 To J
         n1 = n1 + 1
          ReDim Preserve x_(1 To n1)
        
         x_(n1) = zr(n1 - 1): y_(n1) = zi(n1 - 1)
         x_(n1) = Format(Val(x_(n1)), "0.000000"): y_(n1) = Format(Val(y_(n1)), "0.000000")
         
       Next
   
    '位序倒置
n = sb '求数组大小,其值必须是2的幂
lh = n / 2
    J = n / 2
   
    For I = 1 To n - 2


    Debug.Print I, J
    k = lh '下面是向右进位算法
Do
    If k > J Then Exit Do '高位是1吗
J = J - k '是的,高位置0
    k = k / 2 '准备次高位的权
Loop Until k = 0 '次高位的权若非0,则检查新的次高位
J = J + k '非则若最高位是0,则置1

xr(I + 1) = x_(J + 1): yr(I + 1) = y_(J + 1)
    'js = js & "/" & x_(J + 1)
    'js1 = js1 & "/" & y_(J + 1)
    Next
    'sx1 = "/" & x_(1) & "/" & x_(1 + sb / 2) & js
    'sy1 = "/" & y_(1) & "/" & y_(1 + sb / 2) & js1
   xr(0) = x_(1): xr(1) = x_(1 + sb / 2)
   yr(0) = y_(1): yr(1) = y_(1 + sb / 2)
   
   
   ns = Len(a) \ 4: Jn = ns
  
      
  

  ReDim zr(0 To ns - 1)

  m = 0
  l = 2
  pi = 3.14159265358979
  Do
  l = l + l
  m = m + 1
  Loop Until l > ns
  ns = l / 2
  ReDim xi(ns - 1): ReDim yi(ns - 1): ReDim zi(ns - 1)

  l = 1
  Do
    le = 2 ^ l
    le1 = le / 2
    wr = 1
    wi = 0
    If l = 1 Then
    t = 0
    Else
    t = -1 * pi / le1
    End If
    w1r = Cos(t)
    w1i = -Sin(t)
    r = 0
  Do
    p = r
    Do
     q = p + le1
     
     tr = xr(q) * wr - xi(q) * wi
     ti = xr(q) * wi + xi(q) * wr
     tr1 = yr(q) * wr - yi(q) * wi
     ti1 = yr(q) * wi + yi(q) * wr
     
     
     xr(q) = xr(p) - tr
     xi(q) = xi(p) - ti
     xr(p) = xr(p) + tr
     xi(p) = xi(p) + ti
     
       yr(q) = yr(p) - tr1
      yi(q) = yi(p) - ti1
      yr(p) = yr(p) + tr1
      yi(p) = yi(p) + ti1
     xr(p) = Format(Val(xr(p)), "0.000000"): xi(p) = Format(Val(xi(p)), "0.000000")
     yr(p) = Format(Val(yr(p)), "0.000000"): yi(p) = Format(Val(yi(p)), "0.000000")
      p = p + le
  Loop Until p > ns - 1


  wr2 = wr * w1r - wi * w1i
  wi2 = wr * w1i + wi * w1r
  wr = wr2
  wi = wi2
  r = r + 1
  Loop Until r > le1 - 1
  l = l + 1
  Loop Until l > m

  For I = 0 To ns - 1 '仅输出模
zr(I) = (xr(I) - yi(I)) / n
      zr(I) = Format(Val(zr(I) + 0.5), "0.000000")
     If InStr(zr(I), ".") = 0 Then
     s121 = zr(I)
     Else
     s121 = Left(zr(I), InStr(zr(I), ".") - 1)
      End If
      's0 = "/" & s121 & s0
      zr(I) = s121
      Next
      For i1 = 1 To Val(Jn - sb1 + 1)
      zr(sb1 + i1 - 2) = 0
      Next
      
     
     
      For i1 = 0 To n - 1
      If zr(i1) < 0 Then
      zr(i1) = "0000"
      ElseIf Len(zr(i1)) < 4 Then
      zr(i1) = String(4 - Len(zr(i1)), "0") & zr(i1)
      Else
      zr(i1) = zr(i1)
      End If
      
      's5 = s5 & "/" & zr(i1)
      
      If i1 = 0 Then
      
      s6 = Val(Left(zr(i1), Len(zr(i1)) - 4))
      If Len(s6) < 4 Then
      s6 = String(4 - Len(s6), "0") & s6
      Else
      s6 = s6
      End If
      s8 = Right(zr(i1), 4)
      ElseIf Val(zr(i1)) >= 0 Then
      s7 = Val(zr(i1)) + Val(s6)
    If Len(s7) = 4 Or Len(s7) = 8 Or Len(s7) = 12 Then
          s7 = s7
          Else
          s7 = String(16 - Len(s7), "0") & s7
         End If
      s10 = Right(s7, 4)
      s11 = s10 & s11
      If Len(s7) < 4 Then
      s7 = String(4 - Len(s7), "0") & s7
      ElseIf Len(s7) = 4 Then
      s6 = "0000"
      Else
      s7 = s7
      s6 = Val(Left(s7, Len(s7) - 4))
      End If
      Else
      s6 = s6
      End If
     
      Next
      s9 = s6 & s11 & s8
     
   
   s9 = qdqd0(Trim(s9))
   
     's2 = nifft(dxcx1(Trim(s)), dxcx1(Trim(s1)), Trim(sb1))
     
     's3 = nifft(Trim(sx1), Trim(sy1), Trim(sb1))
      MbC4 = s9
  End Function

  Private Function qdqd0(sa As String) As String
  a = sa
  Do While Left(a, 1) = "0"
  a = Mid(a, 2)
  Loop
  If a = "" Then
  a = 0
  Else
  a = a
  End If
  qdqd0 = a
  End Function


[此贴子已经被作者于2021-5-4 18:44编辑过]

#295
ysr28572021-04-13 21:06
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601*
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601=
7172463269826462171528525227724894034214868966993605795401948124722087997342143358371455108964150545128907248526343196455641573509751354673861557821110693231777877738015812129161714061189179959717148156972438006245711375491637996368054355662274712424986912135083307535204835752100527089372858343068979871404409740751212288162364580340051030336669437742592243358179513860552191185265379861524597999525415656854787911581643398207658315370562159727183489341082919000873799051151043947664730614606995331479395199806790880383623001985260201859351553733798110323146855143033755798433086479488024524618236189650830082641102858321608765095677671296332855383698658513841618432462514767301509015302731887426449020324508457305854743150812148135681998160759231340593224787524059384993567619253642859738374890522751502722301228640973352385535814528059287908278674678352643221455078097708537386230468632692143543786079089278143231331448551012324709811279702452779256184630920739523413422282624035439915227985252545794326379126775078358185074208637164548385049952343933304537250581118807518766053939393481540287533027802322405590412993878611099596612132868370166415773181601154351447449360821364030895301897439991811626252222800042408837799445748876986689983744267954539975623901497977921404672456088365607147517753334119523085306549029501450784349931681757118493080278423158884618389416751863515799501941931299333482860034175574234687366084034854559860406380515922622731215797937947749347523567616361602120568917837553302958455697473044355271553097193939898199130578212161450820530733402948944817740996785663578468527435799222211621687841330657355269886610809724657106599734412672509267528377383850891990213998928910925665771135271178329415173122279497587450094043452968217137897325537655382191951751305922520305745720481516125474084463651538358435467578314496534799610440729366870223201955669253868969728058316618723047893958806793103141691041934281198205584987981081000108093858653439624897454612814469707610638127291418381351191694294777021231948012520106211264528527924444201382244571278473214765325480705119868390993533790074524744095675902347116176374826615934187667836147701248099347800023505688743794273915955274979733822944679464000508774509390349906781765163794451106428726498478530824886867498104246201491752880954757001517163612506498931595524274363029567180050754500432532286684708062072343197640125970583268910454330495069475260464330960780880190756901690402890214548943068478380757588861100818684623184339329031152871493812892138965016318354449639572431218054475101906966356246728290357749255900892206636706659073323666601520176669794618490222246109251969096246673833325909200541908647265810778433581200066738963648865628467965987974276129559867820082461324727175812909248560556153989070551651206916397043015129112324174041078381598687340367330369743574483768123513914466078688385552657957466373141833312470005872038158158558758597782287039757518156507558332909095180665881503900399254393925538499082517233770693477475440628379280827399682320040292147212671478850267113144256467717832789836095684233795606474628605577407950893979220730884373604393712239399619598622515105407684769318956407495911888144725372198319167914080204643210431914238821762306355036590446232568753016880799686685880210761285646606345578580056778051890680006982633074396045998096007046814297317508472091232768681594848779768724106961419347315786049071217250606391912412090036387359478549697004116901877456389276560046168633296499987754935871886741805805544288336626689145248219392479520665544572592654825874224723479880277722687977622479652630381460400253566835128569128126839849213424501027798623052330552639340014466433204854284282451838267652596510117073421554349769115596747847222786403991672125861002797993917039353677197561761018603077826216853034619545722932609155001960887797757724784083641663152934067672560173435725465409431333528091135523120222385280011570777644633992350683777567415457830142061356335821132623807179012101446605207533723888496145283691342928263101524024846536249138277962355381236115191250993587394690915625304012223449766194430885987517644469628964169109557807580762078537823980480277465642584796467360214177043602577120889280685824649388496001273597116159134970313980353087497406685979214581267102484657541875734018573130363674965905476673163481843821632051283681039720334533765017564509447055586120874529359775805844927319441709905022001704116387838005555153895216897265575940773948153176057832585460429745756094209528141488349976396674145584278724158836079117395297220622272613076439797697250956341920663130800734933155473346047738298666918898902058007968877485494163402560976541434704853172824135465265265413974659965992895056898571176505487405592027170864616186946549268484945297743480501600120064292645208037740939399240094229556634953081272586550404921251625234389912469589310281012901392380576054483238327215960879621215969418846522922054542058918325244657436478923637305716604682937562502625439542890870560297001951641986789624288562889846686525163088338471193186909768839469313807434287938259075089209910815237602035006864287774116054689067777229371270478665958455578247242113942197143505270008270270882191459688500066171521085054637377654252805754437567172842547938504092900808035624181824913689212947749777436293373997711125153064037803130649030656558546371288595296468051919653790009777109517042131035126573157883183656149031966290078048334686709613718875861993309644523724063515318637150743743389819818443552464423324971361456328433637001544653164638134029593641252649445564245102383007994865579077339457095651502941609117808906309223556024161286929108818191092639537820354261080758077666630753705679538620750240666605592530730238594235539574877759961712126221403282110319210039096970244934331283753007521745745837118120875705449296773432071049524935985944109558437494014526628545805285283211428212254815968453350353270667791149002454020746551663288384513504477866563520997609007704638752734240019484187769074642477074635474178236636866384721352427137750376744613001123164665522329698946864898915127542184529485587658494587744364754108361832698602920926798129076766271689152063216892000068702714408279505019745577786412160670706124505985662713657321905320058533322793579237307804061839083228241436729193118794125128602094745055040576711788450457579614174565175802897167080710639994745840408397188506013885908234200079470657560761093726188202968121735561672223506544407698071001104638286697863716911974871887889137352956177408235640187026335370180204269652496414622509246371913138867876466852915702002493457796630152391077246573798902025599992921947798890245930826255604543179370599273579602413517025291509137312565324651045766230943157633671851484144506416775604281483649665758671646087878710299223648600430794245286634276337844861170064580136723171347269810295795858398334220900459465680922702870972535103576876292907307652387534960191148834056753451657660931145515183543034393594453522937133734797355509943645187648731036090794950906104283431878826206307827524070028872299576965917050394234259986403377998509485079981363227077920026415618622428351304948072774838856801910366262559417442075232876162498709886882802124652312784435273507112770600208831184523646975165214379848407565171174246809997646009632924601230290592771311174549485322280542389123380462520652882111312033936289163788141960823931696888562106170237706550474284332740770252213900167894107284777482550350071361367151033525557171242907760562806679088740080478417471947819864720913692727336875658905474567774039096016299963871473601740086381354357179117749979110998112356352808189165842640207385776942252523358810039236078255183525529059874835125061234394074934909132255049783257541224053548198808652934695191418942834052371211524505976359110862030354610440635466142233137032127828857341531945816347930334509783514826135049690966965590328180073893837602188523301252123322723686120745275718705335983789003879497358018233759586456552862045742698107466630548973174919196570904489890564814069316083928253565097210010972987364689613782060247756229844584102377898827698947656763349306029039082478169225459931807461582437866510644539950728909670405185406776395849139556079466224657039622466467248175545823623111884112843786943196766907877471459634386322517853379671635861176446902694845586618133960389483456792263969375099395117758301586552554735290557282182649471723233085316948575654535258764959248191371622912245057971788968465050758911262576841267180636859779757898070212042118711333384216610181492870803869468282666126519808348146096589922650048641772202198072403546045272458781263186976049222383319870833843327375945414614154247992477644715054102005628243992111786180131664024016803330080223139821644587273437441338849555910477687563186510842007994149483363916523106835536022015378348641756245301023218771922044525978889328011515196392351153367647898428790542145817468347061491199973362848006838675577998841359685950026995771734056969750046174178343024201957430428174909217623707800454587541547999372447814554325540261532995290859332208048663519065389569542084421397802194571699591730237799757313714472333153018836276577894871710374936427805210334149251476143194011904103580927705512657445792637448210801981406325898853914731016758315659836542449366051395779886791126380622850691083405899521557705689988227787187036384654263022977011149854400284754958678411636633870582670219621470547411288183081931679714837078992548282323330288773323468937974805019102283375562950349861921150037994035660525472554512367270458369512316693424357275110365137080817513123195148755802178179447803099975134439746839174283338011413458411062894320960126845861170742217107400439529873590483426646151584669746270815795201用时6.648438秒,有9775位(这是快速傅里叶变换乘法程序的结果,有点慢,不知道咋调整了)
#296
ysr28572021-04-13 21:12
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601*
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601=
7172463269826462171528525227724894034214868966993605795401948124722087997342143358371455108964150545128907248526343196455641573509751354673861557821110693231777877738015812129161714061189179959717148156972438006245711375491637996368054355662274712424986912135083307535204835752100527089372858343068979871404409740751212288162364580340051030336669437742592243358179513860552191185265379861524597999525415656854787911581643398207658315370562159727183489341082919000873799051151043947664730614606995331479395199806790880383623001985260201859351553733798110323146855143033755798433086479488024524618236189650830082641102858321608765095677671296332855383698658513841618432462514767301509015302731887426449020324508457305854743150812148135681998160759231340593224787524059384993567619253642859738374890522751502722301228640973352385535814528059287908278674678352643221455078097708537386230468632692143543786079089278143231331448551012324709811279702452779256184630920739523413422282624035439915227985252545794326379126775078358185074208637164548385049952343933304537250581118807518766053939393481540287533027802322405590412993878611099596612132868370166415773181601154351447449360821364030895301897439991811626252222800042408837799445748876986689983744267954539975623901497977921404672456088365607147517753334119523085306549029501450784349931681757118493080278423158884618389416751863515799501941931299333482860034175574234687366084034854559860406380515922622731215797937947749347523567616361602120568917837553302958455697473044355271553097193939898199130578212161450820530733402948944817740996785663578468527435799222211621687841330657355269886610809724657106599734412672509267528377383850891990213998928910925665771135271178329415173122279497587450094043452968217137897325537655382191951751305922520305745720481516125474084463651538358435467578314496534799610440729366870223201955669253868969728058316618723047893958806793103141691041934281198205584987981081000108093858653439624897454612814469707610638127291418381351191694294777021231948012520106211264528527924444201382244571278473214765325480705119868390993533790074524744095675902347116176374826615934187667836147701248099347800023505688743794273915955274979733822944679464000508774509390349906781765163794451106428726498478530824886867498104246201491752880954757001517163612506498931595524274363029567180050754500432532286684708062072343197640125970583268910454330495069475260464330960780880190756901690402890214548943068478380757588861100818684623184339329031152871493812892138965016318354449639572431218054475101906966356246728290357749255900892206636706659073323666601520176669794618490222246109251969096246673833325909200541908647265810778433581200066738963648865628467965987974276129559867820082461324727175812909248560556153989070551651206916397043015129112324174041078381598687340367330369743574483768123513914466078688385552657957466373141833312470005872038158158558758597782287039757518156507558332909095180665881503900399254393925538499082517233770693477475440628379280827399682320040292147212671478850267113144256467717832789836095684233795606474628605577407950893979220730884373604393712239399619598622515105407684769318956407495911888144725372198319167914080204643210431914238821762306355036590446232568753016880799686685880210761285646606345578580056778051890680006982633074396045998096007046814297317508472091232768681594848779768724106961419347315786049071217250606391912412090036387359478549697004116901877456389276560046168633296499987754935871886741805805544288336626689145248219392479520665544572592654825874224723479880277722687977622479652630381460400253566835128569128126839849213424501027798623052330552639340014466433204854284282451838267652596510117073421554349769115596747847222786403991672125861002797993917039353677197561761018603077826216853034619545722932609155001960887797757724784083641663152934067672560173435725465409431333528091135523120222385280011570777644633992350683777567415457830142061356335821132623807179012101446605207533723888496145283691342928263101524024846536249138277962355381236115191250993587394690915625304012223449766194430885987517644469628964169109557807580762078537823980480277465642584796467360214177043602577120889280685824649388496001273597116159134970313980353087497406685979214581267102484657541875734018573130363674965905476673163481843821632051283681039720334533765017564509447055586120874529359775805844927319441709905022001704116387838005555153895216897265575940773948153176057832585460429745756094209528141488349976396674145584278724158836079117395297220622272613076439797697250956341920663130800734933155473346047738298666918898902058007968877485494163402560976541434704853172824135465265265413974659965992895056898571176505487405592027170864616186946549268484945297743480501600120064292645208037740939399240094229556634953081272586550404921251625234389912469589310281012901392380576054483238327215960879621215969418846522922054542058918325244657436478923637305716604682937562502625439542890870560297001951641986789624288562889846686525163088338471193186909768839469313807434287938259075089209910815237602035006864287774116054689067777229371270478665958455578247242113942197143505270008270270882191459688500066171521085054637377654252805754437567172842547938504092900808035624181824913689212947749777436293373997711125153064037803130649030656558546371288595296468051919653790009777109517042131035126573157883183656149031966290078048334686709613718875861993309644523724063515318637150743743389819818443552464423324971361456328433637001544653164638134029593641252649445564245102383007994865579077339457095651502941609117808906309223556024161286929108818191092639537820354261080758077666630753705679538620750240666605592530730238594235539574877759961712126221403282110319210039096970244934331283753007521745745837118120875705449296773432071049524935985944109558437494014526628545805285283211428212254815968453350353270667791149002454020746551663288384513504477866563520997609007704638752734240019484187769074642477074635474178236636866384721352427137750376744613001123164665522329698946864898915127542184529485587658494587744364754108361832698602920926798129076766271689152063216892000068702714408279505019745577786412160670706124505985662713657321905320058533322793579237307804061839083228241436729193118794125128602094745055040576711788450457579614174565175802897167080710639994745840408397188506013885908234200079470657560761093726188202968121735561672223506544407698071001104638286697863716911974871887889137352956177408235640187026335370180204269652496414622509246371913138867876466852915702002493457796630152391077246573798902025599992921947798890245930826255604543179370599273579602413517025291509137312565324651045766230943157633671851484144506416775604281483649665758671646087878710299223648600430794245286634276337844861170064580136723171347269810295795858398334220900459465680922702870972535103576876292907307652387534960191148834056753451657660931145515183543034393594453522937133734797355509943645187648731036090794950906104283431878826206307827524070028872299576965917050394234259986403377998509485079981363227077920026415618622428351304948072774838856801910366262559417442075232876162498709886882802124652312784435273507112770600208831184523646975165214379848407565171174246809997646009632924601230290592771311174549485322280542389123380462520652882111312033936289163788141960823931696888562106170237706550474284332740770252213900167894107284777482550350071361367151033525557171242907760562806679088740080478417471947819864720913692727336875658905474567774039096016299963871473601740086381354357179117749979110998112356352808189165842640207385776942252523358810039236078255183525529059874835125061234394074934909132255049783257541224053548198808652934695191418942834052371211524505976359110862030354610440635466142233137032127828857341531945816347930334509783514826135049690966965590328180073893837602188523301252123322723686120745275718705335983789003879497358018233759586456552862045742698107466630548973174919196570904489890564814069316083928253565097210010972987364689613782060247756229844584102377898827698947656763349306029039082478169225459931807461582437866510644539950728909670405185406776395849139556079466224657039622466467248175545823623111884112843786943196766907877471459634386322517853379671635861176446902694845586618133960389483456792263969375099395117758301586552554735290557282182649471723233085316948575654535258764959248191371622912245057971788968465050758911262576841267180636859779757898070212042118711333384216610181492870803869468282666126519808348146096589922650048641772202198072403546045272458781263186976049222383319870833843327375945414614154247992477644715054102005628243992111786180131664024016803330080223139821644587273437441338849555910477687563186510842007994149483363916523106835536022015378348641756245301023218771922044525978889328011515196392351153367647898428790542145817468347061491199973362848006838675577998841359685950026995771734056969750046174178343024201957430428174909217623707800454587541547999372447814554325540261532995290859332208048663519065389569542084421397802194571699591730237799757313714472333153018836276577894871710374936427805210334149251476143194011904103580927705512657445792637448210801981406325898853914731016758315659836542449366051395779886791126380622850691083405899521557705689988227787187036384654263022977011149854400284754958678411636633870582670219621470547411288183081931679714837078992548282323330288773323468937974805019102283375562950349861921150037994035660525472554512367270458369512316693424357275110365137080817513123195148755802178179447803099975134439746839174283338011413458411062894320960126845861170742217107400439529873590483426646151584669746270815795201用时0.1875秒,有9775位(这是模仿手工计算的快速乘法程序结果,比利用快速傅里叶变换的程序还快了许多倍呢,谁知道利用快速傅里叶变换的程序该咋调整呢)
#297
ysr28572021-04-14 19:07
回复 290楼 wds1
谢谢版主指点!大师风范!
用这个程序结合我的快速幂程序,居然可以算出70万位的整数,如下是程序运行结果:
2^2325350=有700001位,用时18444.16秒1260135477295498236772837275258605402586043370233933684728694569343126574180419342791414950673338193635011352399298746520113764324295773989245…………

[此贴子已经被作者于2021-5-5 15:43编辑过]

#298
ysr28572021-04-18 15:22
结合那个模仿手工计算的快速乘法程序,做的对单个大整数的素性测试的程序,速度提高不少,比如输入:233333333333333333333333333333333333333333333333333333,输出结果:这是素数有54位,用时3.386719秒。(输出为“3*”或“2*2”等带*号的都是合数,为了做成可调用程序时调用和区别结果方便,凡合数输出结果都带有*号的,程序只做判断不分解因数)
传一下这个可执行程序,欢迎实验和沟通探讨!
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-4-18 15:46编辑过]

#299
ysr28572021-04-23 09:22
分治法程序原理,见如下截图:
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
#300
ysr28572021-04-23 10:04
而模仿竖式手工乘法的竖列算法原理,就是各项相乘结果,先各竖列分别相加,再把结果横行错位相加,如下面的截图:
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-4-27 05:58编辑过]

#301
ysr28572021-04-25 07:31
2678145490787694710138406683675886762424440548647327525594133873038347266950777818028529804877891353347244255046176220880989519574806598935727647635506939520211209794328712328126947740602255036264392628020291100698432900022333877728824270241063030019536831205264726059774673235680796770108334187808344470141093691232926021244583649747591446066921535333854157441330339217364515328375889937313870826987520723914810358707312468857074455945610038118763873992681688857200178452843740327143990247797893489008808544535536081089994800692174759199578596435124153437689121057209523619989593900355037400039597165241729693472001589594642879166693443994939359639600558001937547209387175085119128575833396037478944824322315197771750730768383267287661855880237549141571520374996029107650341071074081501632143441365461865431362023790463469688071768208320226561675630348708531708110373889241713511809029065048200924851629507265095151843687852114948736130517024578482059771284515915597919026074110811882700307150650858080695566672584075215926450360584738705106755945308199980660478183563586945902705730231409948938478910176292179410952310592864745025373902249844607078729230098512959498522851990040833671698873183076996740726479481352429756295966452788332789259316653805673821716832204368483794501474641036177256005810416507649770210480747056764697918800240201155395628561684853684747063434500664449114760179367086926249813006056735202795763742271472136500817313178050955623517148960973128433455798444839070215800699075256371341531892841721456473301085595261371522078416420399702683504171019191363372883472415693921509069484448792009627325245658854979159002549542769741504596589556474585723101403486046952706847309188488390899096649210853675228464611999630360164703837131620319658277117300208326944026347808645954842782309633205645471959842390075986572806483755223497552549948718545978420793425036666212191832327909389117021539426917904222971515424022606157676379417252939026404363841301595348953340657745965591468370831371449860774296757556463049237248472613472436666799615694672489600751763956185893123579218797539971253828850163437053164723845196089466298000486042246621634263064752906475198879616484926366053597071510886820878425907736453843197228282179943365206039514850477377542684361730162273246709577442085159313947668552462343596819299335060863266863059421286080919061657175757802930378698062290163092494909661982639303946271889619023417245433500782685534406291391527022657608608130680134939380126048353657648559735671562230714451258764762350451448379438849319710473631625533527602085050858633346936315115309333355986556546113134787213610042970405680162084678021281774169131725296977361816657904233850711837826724976507876061043779177845550646612327663283839673950405472039432309339110648301347672597370034346896334064135099613033528785924976781865447506814375627647103020761819104412269362847848884053177378762432543285984193091289854949394023586451139393716370633759317698908834326333339634557238526607966375935960004339535161203546369910853171524516945554862019134684985868547068709986010719120259421723270478586992153989283736650948010894951434857207445141886625290777550599700738909777829412358941157674866550887608199469723859806486384262574182811908513849905040209776132986875560077482527819093584150609347560543627976011009349905362597935257895287412087233810106693141683912683308201407373637490835862452911394718399632093441745957478079754723679119343225931665785380948807114301164623717144211285944154289093317610519159281033583963015810556464180819928345256832572962092994993950655913067768151113345566231088759030148164710287289335782462899525700500822021472132532771242198844498579102733028256523810973405350508253183399668290339844052874956694050028526577775764032598023622192221226501334606994447870277619118208162133562541678250491647671042612088902952091163094215645902682086024337098910110924115381788866213335441814530141911754446270296630426675020592640816713810936850961517475097707179713115856513919631998747192606018612535436009162735908155778165736923393260822217415131632296810207091918499370220533980666393617256227781299273913099896641458499949922475383775878771011361417556799406151773618626138749998464514570482965286184387350245762317271666329142667987131139265167425606863654107927682419958167046956962340419295394058625063862272314570914511355913547470055072878835349142049813368019960713974852351833144227544851625677753419141348585495260230041111323576432417502998832485027071744397105338790364666312325483218209150368759120749671419554589928540715813531144241705501211397506662448276056294585639532800634727428900861538486753011006379264618338782036690340859441153926551954112364946638768223012718907190897165613382555036872673785444132692292217184974818914501886689736449912131900762592363447945036085692999163815947845753538999001633767986447907729462453017601用时0.9394531秒,有4888位(这是利用快速傅里叶变换的乘法结果,改进了一下,5位一组,速度稍有提高,但仍然不如前面的模仿手工计算的快速乘法)
123456789