我想在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
有人能建议更快的方法吗?
答案 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