如何使用MATLAB快速检查数组是否是互质的

时间:2013-11-26 00:14:10

标签: algorithm matlab primes discrete-mathematics prime-factoring

我想在MATLAB中编写一个函数,可以快速确定数组是否是互质的。形式上,我们说如果分割所有N个元素的最大正整数是1,则N x 1数组x是互质的(有关更广泛的definition,请参见此处)。

我想到的函数应该输入一个整数数组x,如果x是互质的,则输出true。一些例子:

%example
x = [6,10,15];
iscoprime(x)
> true

%counter-example
x = 2*[1,2,3];
iscoprime(x)
> false

回答目前最好的尝试是:

function value = iscoprime(x)

%remove 0 and take absolute value
x = abs(x(x==0));
nx = length(x);

%return true if all original entries = 0
if nx == 0, value = true;

%return false if x only contains 1 value and it is not 1
elseif nx == 1 & x~=1, value = false;

%return true if x contains a 1 (easy way to tell if x is coprime)
elseif any(x==1), value = true;

%check if x is coprime (based on Yasen's answer)
else

    v = x(1);
    for i = 2:nx
        v = gcd(v,x(i));
        if (v == 1), 
            value = true;
            break
        end
    end
    value = false;

end
end

有人能建议更快的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用the built in MATLAB function为阵列中的每两个连续数字找到最大公约数(GCD),并将结果累加到某个变量GCD中。如果GCD = 1,则数字是互质的。否则,它们不是互质的,而GCD是它们的共同因素。

以下是代码:

function GCD = iscoprime(x) % assuming x is an array, 
    GCD = x(1);             % returning greatest common divisor for the array
    for i=1:size(x, 2)
        GCD = gcd(GCD, x(i));
    end
end