当divident提高到一个幂时,matlab错误的模结果
只是想知道。。。我试着用手(用乘法和平方法)做(111^11)mod143运算,结果是67。我还检查了许多在线工具是否正确。然而,在这方面:当divident提高到一个幂时,matlab错误的模结果,matlab,modulo,Matlab,Modulo,只是想知道。。。我试着用手(用乘法和平方法)做(111^11)mod143运算,结果是67。我还检查了许多在线工具是否正确。然而,在这方面: mod(111^11,143) 给127!有什么特别的原因吗?我在文档中没有找到任何东西…的111^11(关于3.1518e+022)的值超过了as adouble,即2^53(关于9.0072e+015)。因此,由于数值精度不够,结果会受到影响 要获得正确的结果,请使用符号计算: >> syms x y z >> r = mo
mod(111^11,143)
给127!有什么特别的原因吗?我在文档中没有找到任何东西…的
111^11
(关于3.1518e+022
)的值超过了as adouble
,即2^53
(关于9.0072e+015
)。因此,由于数值精度不够,结果会受到影响
要获得正确的结果,请使用符号计算:
>> syms x y z
>> r = mod(x^y, z);
>> subs(r, [x y z], [111 11 143])
ans =
67
或者,对于此特定操作(表示为小数值乘积的大数值的模),您可以使用以下事实(其中∗代码>表示产品):
国防部(a)∗b、 z)=mod(mod(a,z)∗模(b,z,z)
也就是说,您可以对大数的因子应用模运算,并且最终结果不变。如果选择足够小的因子,以便它们可以精确地表示为double
,则可以在不损失任何精度的情况下进行数值计算
例如:使用分解111^11=111^4*111^4*111^3,因为所有因子都足够小,所以可以得到正确的结果:
>> mod((mod(111^4, 143))^2 * mod(111^3, 143), 143)
ans =
67
同样,使用111^2和111作为因子
>> mod((mod(111^2, 143))^5 * mod(111, 143), 143)
ans =
67
在matlab中,他们建议使用powermod(b,e,m)
(b^e mod m)
“如果b和m是数字,则模幂b^e mod m也可以通过直接调用b^e mod m来计算。但是,powermod(b,e,m)
避免了计算中间结果be的开销,并更有效地计算模幂。”…另一种方法是使用symfun
syms x y z
f = symfun(mod(x^y,z), [x y z])
f(111,11,143)
我懂了。。。我只是想,因为有一个直接的结果,matlab在mod()中执行某种快速的求幂运算,对于这样的情况……求幂运算很快。在极少数情况下,MATLAB或任何其他数值计算引擎实际上会将一个数字自身乘以N次来计算x^N。这与您试图修改的数字的大小无关。我不知道您问题中的操作是否只是一个示例。但是如果你真的需要计算一个大数的模,这个大数表示为一个小数的乘积,你可以对因子进行模运算,从而避免数值误差。我用这个编辑了我的答案,我刚刚检查了powermod()仅在2014b版本中可用!太可惜了,我没有:P无论如何,谢谢!