编辑注意:该文件被选为MATLAB Central挑选本周
每过一段时间,我一直想要做算术与幅度超过了它可以适合MATLAB的标准数据类型大整数。由于我没有象征性的工具箱,简单的解决方案是把它写在MATLAB。我这样做,在这些工具被完全用MATLAB,所以没有必要编译代码。
使用vpi工具,算法很简单。
A=vpi(17)^17
ans =.
827240261886336764177
17+A^17
ans =.
39786732894291535047752038041559739510060813980024082
30012867731573722066105737100731556603857745946047229
53759676529121155309750944582301597489457676380805029
59227566911971103003303064782118652210655457390045806
99039190393572334521701109889855832341416056005878848
49943142324389193616484809157960034059531548585473213
36465170635561696613297503569949729314
还有一些不错的附加组件,例如,一个用于计算大参数或大阶乘的精确二项式系数的工具,或者将具有数千位数字的二进制数转换为十进制(vpi)形式。
例如,在MATLAB现有nchoosek功能被打乱甚至相当小的二项式系数。
nchoosek(100,50)
警告:结果可能不准确。系数大于1.000000e+15
精确到15位。
>在nchoosek在66
ans =.
1.0089e + 29
然而,nchoosek对VPI数字没有这样的问题。
nchoosek(vpi(100),50)
ans =.
100891344545564193334812497256
类似地,阶乘(171)的计算也会导致溢出。虽然我承认有很多好方法可以避免这个问题,但factvpi函数根本没有问题。
阶乘(171)
ans =.
Inf
阶乘(vpi(171))
ans =.
12410180702176678234248405241031039926166055775016931
85388951803611996075221691752992751978120487585576464
95950167038705280988985869071076733124203221848436431
04735778899685482782907545415619648521534683180442932
39598173696899657235903947616152278558180061176365108
428800000000000000000000000000000000000000000
现在有GCD和LCM工具,它们都可以接受两个以上的输入参数。
lcm(vpi(123452356)、1234433265364467)
ans =.
3557547184310976844988
我也把一些工具,可以测试素性。例如,梅森素数:
P = VPI(2)^ 127 - 1
ans =.
170141183460469231731687303715884105727
isprime(p)
ans =.
1
现在已实现vpi数的因数分解。
因子(VPI( '1234567890123456789'))
ans =.
3 3 101 3541 3607 3803 27961
载体或VPI数字阵列现在的工作非常漂亮。
A=vpi(眼睛(3))*3+1
A =
4 1 1
1 4 1
1 1 4
a ^ 17
ans =.
5642305908354 5642176768191 5642176768191
5642176768191 5642305908354 5642176768191
5642176768191 5642176768191 5642305908354
其他工具数十也包括在内。我甚至还包括只是为了好玩一种工具,将一个数转换成它的可读文本版本作为一个大的整数。
vpi2english(VPI( '12000000110022987'))
ans =.
12万亿,1.1亿,22000,987
对于周围的项目Euler解算器,vpi使许多问题易于解决。
附录-Ben Petschel为我提供了在vpi阵列上执行unique和sortrows操作的代码。非常感谢Ben!
引用
约翰D'ERRICO(2021)。可变精度整数算法(//www.tianjin-qmedu.com/matlabcentral/fileexchange/22725-variable-precision-integer-arithmetic),MATLAB中央文件交换。检索到。
MATLAB版本兼容性
平台兼容性
窗户 马科斯 Linux.标签
致谢
灵感来自:多重精密MATLAB工具箱
启发:字数转换那对于该方法等效于总结的各自的数字的阶乘的数量MATLAB代码那数不胜数那多根多项式解决了部分分数膨胀那nextprime那sumsqint那分数工具箱那num2vpi-将输入精确转换为vpi那用阿基米德计算π那HPF - 大小数类那数字