|

楼主 |
发表于 2012-3-10 15:51
|
显示全部楼层
[原创]大整数的乘法
两位老师好,下面推出正规版验证方法,(上面的是忽悠人的,不要受误导):
a = 5192 02532 99870 41388 59072 78116 03754
b = 20 28240 96036 51670 42394 72512 86016
a/b = 255.98661 26089 99999 99999 99999 99999 95804 36565 16689 74965 35606 91114 52677 61131 80517 31359 44642 12656 02111 81640……
上面这个是本人编程做的“大数相除”,小数有 100 位。不知楼主能不能验证上面的计算是否正确?
对高位的验证,
20 28240 96036 51670 *255 98661 26089(商的前13位有效数字) =51920 25329 98501 30391 05541 8630,共有17位与13位相乘,得数29位,29-17=12位,
与前19位被除数前19位的比较,
51920 25329 98501 3039-5192 02532 99870 41388 =-2028349,仅末尾7位不同,有前12位相同,
对末尾数字的验证,
72512 86016(除数末尾10位)*44642 12656 (商倒数第20位后取10位)=32371 28280 49030 18496(共20位数字),
末尾10位49030 18496与余数的比较,
"余数"=72512 86016*02111 81640(商最后10位)=15313 38472 96794 6240(共19位),
49030 18496-15313 3847(余数前9位)=47498 84649(这应该是前段商值的余数,无法对照),
42394 72512 86016(除数末尾15位)*99999 99999 (商值. 后第11位后取10位)=42394 72512 43621 27487 13984,与被除数末尾比较,
8 59072 78116 0375(被除数第18位后取15位)-42394 72512 43621 (取前15位)=43512 55299 16754(共15位,无法与后面的对照),与后面余数对照,
"余数"=42394 72512 86016*99999 99999 95804 (商值. 后第21位后取15位)=42694 72512 84237 11733 36038 76864(共30位)
43512 55299 16754-42694 72512 84237 (余数前15位)=817 82786 32517(共13位),
计算器试除a/b=5192 02532 99870 41388 59072 78116 037/20 28240 96036 51670 42394 72512 86016=2.55986612609(被除数去掉2位),有效数字全部相同,
所以,老师的结果准确,相当好,程序应该推广!
和我运行的结果是一样的。
那么如果
a="204181972518847178731511459272205792.3725762648106369158720449714556708974141349142364448644923186554"
b="20418197251884732432432432423432423324178731511459272205792.3725762648106369158720449714556708974141349142364448644923186554234"
a/b="0.0000000000000000000000099999999999999928694580099855311814333832059747528320512312544690041006331089896841048206045437850801125169285958648464645305455307601131698230358121859872037958276564685922576439715475993323752258151677056392535649988592943440545144186666367461644699154962489320534313136073254528566396208622912747914654284517442501275421539574253845056890372220516907916763212486881712630980329339566414076320736640270772070459866870258348245991001397346540490420567741574430516003161171367625886090379321596535525"这是保留到小数点后532位,请天山草,上面计算结果正确吗,如果正确你你计算这个花费的时间是多少?能否分享下 除法的算法。
a = 2041819725188471787315114592722057923725762648106369158720449714556708974141349142364448644923186554000
b = 204181972518847324324324324234324233241787315114592722057923725762648106369158720449714556708974141349142364448644923186554234
a/b = 0.0000000000000000000000099999999999999928694580099855311814333832059747528320512312544690041006331089896841048206045437850801125169285958648464645305455307601131698230358121859872037958276564685922576439715475993323752258151677056392535649988592943440545144186666367461644699154962489320534313136073254528566396208622912747914654284517442501275421539574253845056890372220516907916763212486881712630980329339566414076320736640270772070459866870258348245991001397346540490420567741574430516003161171367625886090379321596535525
上述结果跟 shikang999 算的完全一样。时间很短,一瞬间吧,没法测量。我用的是 VB 程序,不知道如何测量运算时间。
1、我是使用的VB.NET编写的函数。我也不知道怎么测试运行时间,但是我喜欢用TickCount函数来大概估测一下,你不妨也使用这个函数试一试。
2、由于我发现我写的大数的除法运算速度还是很慢的,如下一个例子:
a=72860 25439 24414 75520 44768 094494970670453821245103478375113499668041140478785169550238619398440399354360511215249981485425965375223278917156823159189309716583125389316214011310664761586451135133634051116088202871228049435860420534523953539377020921360927922119685232294019303511214566996715426428121838461181533186903657201412864629321377235160683482314413148591336984203200351323014462317841013401383182724797916811965352050885789411664364124676151711501269291880401829929488523556711481149544177837066677475459160710896270712672659031843848967118434756044257531716636028001821339476153114482200285750574045687126830139714288434062087475459581768764210984229659577958821325419218720000411703661584127503689314021935132293912819290559551694336547957018392178821463618384242222108009931463934140107045125647452181323584511441517072426941579794694494129308237362501191542248726399873954218208650501821737541293117302813115633125320229241289513862204238347167255266499275311877682801284622241944430249183
b=17399 67521 24940 94886 22857 855152482416357727328021957794584620460158092615420722903969261762619449476903591896186034426581333290897101515173166082724019857096758736527502097897321100101198043357931706352423299562981122414178221803487287465469198943719356861866767271537218826850154557464947952156144804806231877363515222636671457150740996161922194391695911238913395895263281221315776201239486178522505110670374191375926443178420582812210228465400926515906519361544762775146176798532749228385736405714274243573246793666151279769498465071546199720130678929118501022361377624399277585934205569442918960538117843547791149732076202619264287356279011106542261791848080664665318417927161897245058150837099393617799060309630720686110191380009209199569898658131269118011154929354279281125450378127543624442091703012825421120853352041200539913155268414917549923421654787880159744584963712766814212727501359385576943729842293028704159561967014301662872261943671905496833347460056109083868619462875038800974571419
a/b=7286025439244147552044768094494970670453821245103478375113499668041140478785169550238619398440399354360511215249981485425965375223278917156823159189309716583125389316214011310664761586451135133634051116088202871228049435860420534523953539377020921360927922119685232294019303511214566996715426428121838461181533186903657201412864629321377235160683482314413148591336984203200351323014462317841013401383182724797916811965352050885789411664364124676151711501269291880401829929488523556711481149544177837065868505231173124236820855075704636366570177371509778260216391868140767498258058947673403832442172774726041082417211900923029524576950174483820882703208333421315973198425334164846487947133979876705915802422662668631260494759668772885641310801513744504372897972418710118040660303613668807848056365045423008242479944638988838692684819787881635446009120754375691038896343733918619182906337409933966410120509163144051939927163392190033650580109779966993712350408864228363394096017247255065520711670956455.765753641849466967929396076517146294535561048535796042061720245540961379681763106266820707923527075315385457058652437134280660762677704440709714075208514004040847752512719432340025297325208904392134696109430942216656332932598146699244261746223864691014870800917149898944917782946190947168759737279627848590468016649497141818527590737212605571499248788269883582499777841563278388906034867898894011393411809765725542028979815681493027871647966556852353933047132622079394602204918796425969978500889845213';小数点后500位
运行上面的除法花费31ms(当然,不同的环境应该会有所差别),而对上面a*b进行运算花费的时间基本为0ms相比,确实不能让自己容忍.希望大家能一起讨论下大数的除法的算法。
当然,我可以先说下我的大数除法的算法。由于字数我直接连接到我的博客日志http://blog.163.com/shikang999@126/blog/static/172624896201111410352184/
希望天山草也能说下你的除法的算法!
被除数与除数各取25位试除,72860 25439 24414 75520 44768 /17399 67521 24940 94886 22857 =4.18744 91048 04156 86574 26237 72097 7,无法对照,可能是a*b运算,
a*b(同样取25位)=1.26774 47623 28177 94087 84563 35294 3e+49与上面不同,
速度够快,不知是啥算法?
我才发现,计算机程序附件中的计算器,是可以算33位有效数字的,且数字精确可靠,网上的在线计算器,能算20多位的,当数字超过20位结果末尾就不可靠,甚至有多位不对,真是!!!
两位老师的程序非同1般,应该推广,但当今科学界简直是"无政府状态",好的东西无法推广,没有人给与客观公正的评价,伪劣产品却大行其道,乱收"买路钱",这样下去,后果不堪!
若好的新的东西能不断推广和发展,何必花巨资下载老外的那个"神马牛逼"的东东呢?
|
|