大整数乘法算法思想 大数乘法用什么算法啊?
大数乘法用什么算法啊?
大数乘法基本上就是乘法的垂直计算编码。
有三个基本功能
1。大数的数组表示。
2. 将大的数字乘以小数得到大的数字。
3. 大数字,大数字,大数字。
对于1,意味着int数组的每个元素都存储若干位。例如,每个元素包含四个十进制数字。[0]商店数万,[1]商店数万、数十万、百万、千万,依此类推。一个数组包含一个很大的数。因此需要一个额外的int变量来记录当前数组中使用了多少元素(类似于字符串长度)。
对于2,“decimal”是指可以用int保存的数字。请注意,只有四个二进制位(与1中提到的数字一致)。
例如,对于数字123456789,[0]保存6789,[1]保存2345,[2]保存1。长度3。
这个大数乘以一个十进制数,如9999,其过程是[0]*9999,即6789*9999=67883211。乘积的下四位( 000)3211保存到乘积的[0](大数),6788的进位保留到[1]。
那么2345*9999=?23447655,加上刚才结转的6788,得到2345443,其中4443保存在产品的[1]中(大数),2345结转到[2]。
等等。
对于3,基本上只是一个For,添加位,然后注意进位。
将一个大数乘以一个大数意味着将第一个大数乘以第二个大数的[0](大数乘以小数点后,上面的2)得到一个大数A0;然后将第一个大数乘以第二个大数的[1],得到一个大数A1,最后是A0,A1相加(即大数相加,3以上)。添加时,请注意A1的[0]应与A0的[1]对齐,A2的[0]应与A1的[1]和A0的[2]对齐这与我们的垂直计算相同。
PS:以上算法基本上是“万位小数”的计算方法。如果数组的每个元素只包含一个十进制位,那么它就是一个十进制数。我们使用10000系统的原因是程序员感觉更好。最有效的用法是将每个int保存到2的15次方,即32768。需要注意的是,如果采用十进制进行计算,程序的计算时间将是10000系统的16倍,即效率为1/16。
PS2:使用int数组时,位数最多只能为4。因为5位数相乘可能得到11位数,这超出了int的范围。
大数相乘,快速算法?
有一个快速算法来计算幂,它不是用蛮力一个一个地乘以。例如,如果你想计算2^10000,计算机将首先计算2^5000,然后计算平方,即两个数的乘法。为了计算2^5000,计算机将首先计算2^2500,然后将其平方。这种算法称为快速幂算法。对于2^n的计算,如果每次乘法的时间复杂度为O(1),则总体时间复杂度仅为O(logn)级。R一般来说,为了实现快速幂算法,我们首先对指数进行二进制表示。例如,如果要计算a的23次方,可以将23分解为16421。然后计算B=a^2,C=B^2=a^4,d=(C^2)^2=a^16。最后的结果是ABCD的乘法。但这里乘法的复杂度不是o(1),因为它是无限精度的,称为大数乘法。大数乘法也有许多算法。最简单的方法类似于手工计算。复杂度为O(n^2)。其它方法有分治法、复杂度O(n^1.58)、FFT法、复杂度O(n logn logn)等,在快幂大数乘法的O(logn)次中,最复杂的是最后一次,即2^5000次。前一个几何级数的复杂度会衰减,因此总体复杂度就是最后一次计算的复杂度。如果使用FFT方法,复杂度比线性的要高一些。一般来说,它可以在计算机上随意计算。R CPU不能全速运行,因为这个程序只使用一个内核进行计算,而您显示的是总利用率,所以它将保持在大约四分之一的水平。R是否使用shift操作涉及Python大数操作的具体设计,我不太了解。但原则上,这也是很有可能的。如果位串用于存储大量数字,则2^n的计算只需在数组的第n位设置1,其余可以设置为0。然后转换成十进制是这段代码中计算成本最高的部分。首先,编程是最快的方法。如果你有计算器,你可以从右边每7位除两个30位的数字,这相当于把两个数字转换成10000000个基数。然后,根据书面乘法的规则,列垂直,将每个7位数字视为1位数字,用上述15位计算器进行乘法和加法运算。例如,最右边的位是3383279*0974944=(进位0329850)7561376,可以用25次乘法完成。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。