5

配列内のモジュロ値とその剰余値が与えられた場合、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) 
4

1 に答える 1

3

さて、あなたの目標は、それぞれxを満たす最小のものを見つけることです。B(i) = mod(x, A(i))i

このページには、中国剰余定理を使用して一連の方程式を解く方法の非常に簡単な (ただし徹底的な) 説明が含まれています。したがって、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

このアルゴリズムは、互いに素Aな係数 ( の値)に対してのみ機能することに注意してください。

あなたの例ではそうではないので、これはあなたの例では機能しませんassert(モジュライが互いに素でない場合、スクリプトを壊すコマンドを入れました)。非妥協係数の完全な解決策を自分で実装するようにしてください!

PSまた、このコマンドはEuclid のアルゴリズム
を使用 していることにも注意してください。自分で実装する必要がある場合は、これこれが参考になるかもしれません。gcd

于 2012-09-23T17:22:58.640 に答える