Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当divident提高到一个幂时,matlab错误的模结果_Matlab_Modulo - Fatal编程技术网

当divident提高到一个幂时,matlab错误的模结果

当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

只是想知道。。。我试着用手(用乘法和平方法)做(111^11)mod143运算,结果是67。我还检查了许多在线工具是否正确。然而,在这方面:

 mod(111^11,143)

给127!有什么特别的原因吗?我在文档中没有找到任何东西…

111^11
(关于
3.1518e+022
)的值超过了as a
double
,即
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无论如何,谢谢!