我想在MATLAB中编写一个函数来确定一个数组是否包含至少一个互质对。形式上,如果n
m
和gcd(m,n)==1.
是共同素数
我正在构建的函数应输入向量x
,并返回true/false
值。如果x
包含两个不同的元素n
,m
,那么gcd(n,m)==1.
将返回false,否则此值将为true。因此,我们需要它表现为:
x = [1,2,3,4];
iscoprime(x)
> true
和
x = 2*[1,2,3,4];
iscoprime(x)
> false
我目前最好的尝试是以下功能。
function value = has_coprime_pair(x)
%take out zeros
x(x==0) = [];
%take absolute value
x = abs(x);
%make sure we have elements
if isempty(x)
value = true;
%make sure all elements are integers
elseif any(x~=floor(x))
value = false;
%check if any element = 1
elseif any(x==1)
value = true;
%check if any pair of elements is coprime
else
%get prime factors of all elements
prime_factors = arrayfun(@(x) factor(x), x, 'UniformOutput', false);
all_factors = unique(cell2mat(prime_factors));
%remove 1 from the list of all prime factors
all_factors(all_factors==1) = [];
%x does not contain coprime pair if each element has the same prime factor
value = true;
for f = all_factors
can_be_factored_by_f = cellfun(@(p) any(f==p),prime_factors,'UniformOutput',true);
if all(can_be_factored_by_f)
value = false;
break
end
end
end
end
有人能建议更快的方法吗?
答案 0 :(得分:1)
如果您担心正确性,您应该知道现有代码的失败:
>> has_coprime_pair([6 10 15]) ans = 1
如果速度比正确性更重要,您可以使用
function value = has_coprime_pair(x)
value = true;
end
直接实施您的定义:
value = any(any(1 == bsxfun(@gcd, x, x')))
不确定速度,但它具有正确的优点:
EDU>> has_coprime_pair([6 10 15]) ans = 0 EDU>> has_coprime_pair([1 2 3 4]) ans = 1 EDU>> has_coprime_pair(2*[1 2 3 4]) ans = 0
答案 1 :(得分:1)
我不知道这是否更快,但它绝对更简单:
function result = has_coprime_pair(x)
for ii = 2:numel(x)
result = false;
if any(gcd(x(ii),x(1:ii-1)) > 1) %// test each pair of nunmbers only once
result = true;
break
end
end