在MATLAB中检查向量是否包含至少1个互质对的最快方法

时间:2013-11-25 22:06:45

标签: matlab primes prime-factoring

我想在MATLAB中编写一个函数来确定一个数组是否包含至少一个互质对。形式上,如果n

,则两个整数mgcd(m,n)==1.是共同素数

我正在构建的函数应输入向量x,并返回true/false值。如果x包含两个不同的元素nm,那么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

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

2 个答案:

答案 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