MATLAB中的模和余数(中国余数定理)

时间:2012-09-23 11:14:41

标签: matlab modulo chinese-remainder-theorem

如果给定数组中的模数值及其余值,如何在Matlab中找到最小值?例如:

A=[ 23 90 56 36] %# the modulo values
B=[  1  3 37 21] %# the remainder values

导致答案93;这是最不可能的价值。


编辑:

这是我的代码,但它似乎只显示余数数组的最后一个值为最小值:

z = input('z=');
r = input('r=');
c = 0;
m = max(z);
[x, y] = find(z == m);
r = r(y);
f = find(z);
q = max(f);
p = z(1:q);
n = m * c + r;
if (mod(n, p) == r)
    c = c + 1;
end
fprintf('The lowest value is %0.f\n', n) 

1 个答案:

答案 0 :(得分:3)

好的,所以你的目标是为每个x找到满足B(i) = mod(x, A(i))的最小i

This page包含一个非常简单(但彻底)的解释,说明如何使用Chinese Remainder Theorem求解方程组。所以,这是MATLAB中描述的方法的实现:

A = [23, 90];                                  %# Moduli
B = [1, 3];                                    %# Remainders

%# Find the smallest x that satisfies B(i) = mod(x, A(i)) for each i
AA = meshgrid(A);
assert(~sum(sum(gcd(AA, AA') - diag(A) > 1)))  %# Check that moduli are coprime
M = prod(AA' - diag(A - 1));
[G, U, V] = gcd(A, M);
x = mod(sum(B .* M .* V), prod(A))

x =
    93

您应该注意,此算法仅适用于coprime的模数(A的值)!

在你的例子中,它们不是,所以这对你的例子不起作用(如果模数不是互质的,我会用assert命令打破脚本。您应该尝试自己实现full solution for non-comprime moduli

P.S
另请注意,gcd命令使用Euclid's algorithm。如果您需要自行实施,thisthis可能会为您提供良好的参考。