如果给定数组中的模数值及其余值,如何在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)
答案 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。如果您需要自行实施,this和this可能会为您提供良好的参考。