整数のリストがペアワイズ互いに素かどうかをチェックするアルゴリズム


8

整数のリストがペアワイズ互いに素であるかどうかをチェックするための効率的なアルゴリズムはありますか、またはより一般的なアルゴリズムが利用可能な最良のオプションでしょうか?


念のために言うと、セット内の整数のすべてのペアが素数であることを意味しますか?
Draconis

2
はい、2つの整数のすべての組み合わせは互いに素でなければならない
user2782067

回答:


8

最初に、互いに素な整数に関する2つの事実:

  • IFF とB互いに素であり、その後、B = リットルのC MB abab=lcm(a,b)
  • f bcの両方に対して素である場合 aはb c に対してですabcabc

このことから、積が最小公倍数に等しい場合、一連の異なる整数はペアワイズな素素であることがわかります。{a,b,z}

次のIDを使用して、最小公倍数を計算できます。

lcm(a,b,c)=lcm(a,lcm(b,c))

あなたが持っていると仮定すると、と数字のkはそれぞれ数字、乗算/ 2つの数値を改造/除あるO 1 、その後、(またはしないことがあります機種によっては良い仮定かもしれません):nkO(1)

  • セットの積を計算するにはO(n)
  • 2つの数値のgcdの計算にはO(k)
  • したがって、2つの数値のlcmの計算には、gcdへの還元によりもかかりますO(k)
  • したがって、セット全体のlcmを計算するにはO(nk)

したがって、アルゴリズム全体の時間の複雑さはです。O(nk)


2
OPが実際にこれを実装している場合は、すべての数値を乗算したり、すべてを数値化した後ではなく、それらが読み取られたときに、数値ごとにproduct / lcmが等しいかどうかを評価する価値があります。これで複雑さは変わりませんが、ほとんどのリストが互いに素であることが予想される場合(乱数の長いリストの場合のように)、おそらく高速になります
sudo rm -rf slash

5
@DWポイントは、漸増的にテストすることで、リスト全体を処理した後ではなく、最初の非coprimeの例が見つかれば早期にベイルできるということだと私は信じています。ほとんどのリストはペアワイズプライムではなく、テスト対象のリストに関する情報がないため、リストはおそらくペアワイズプライムではないので、その一般的なケースに最適化された手順に進んでください。 。
Andrea Reina

@AndreaReinaより明確に書いてくれてありがとう
sudo rm -rf slash

別の実装上の注意... lcm == prodの代わりにgcd == 1を使用する方がおそらく簡単です。私が知る限り、とにかく最高のlcmアルゴはgcdを使用します
sudo rm -rf slash

2
数字の桁数を数える場合、乗算と除算がと仮定しても意味がありません。それらはk > 1の場合 Ω k aです。O(1)Ω(ka)k>1
Gilles「SO-邪悪なことをやめ

4

はい。数値の各ペアをチェックする素朴なアプローチでは、2次時間がかかりますが、より効率的なアルゴリズムがあります。次のペーパーで説明されているほぼ線形の時間アルゴリズムがあります。

ダニエルJ.バーンスタイン。本質的に線形時間でコプライムに因数分解します。Journal of Algorithms 54(2005)、1〜30。

https://cstheory.stackexchange.com/q/3393/5038も参照してください。それは、あなたが期待することと同じくらい効率的です。

これがあなたの状況にどのように役立つかを明確にするために、素数の基底を見つけて、各要素を基底に対して因数分解したら、それらがペアワイズ素数であるかどうかを確認することは簡単です:それらがペアワイズ素数でない場合、いくつかのペアは共通になります因数であり、それはcoprime基底にある因数であり、両方の因数分解に存在します。2つ以上の数の因数分解に存在する共通の因子がない場合、その数はペアワイズ素素であることがわかります。因数分解を行うと、複数の因数分解に数値があるかどうかを線形時間で簡単にチェックできます。


2
(まだ)どのようにFactoring over a coprime base関係しているのかわかりchecking if a list of integers is pairwise coprimeません。
greybeard 2018年

@greybeard、編集済み回答を参照-説明の最後に段落を追加しました。
DW

2

各数値の素因数を見つけます。コレクション全体のすべての素数が異なる場合に限り、数値はすべてペアワイズ素数です。このチェックは、ハッシュテーブルを使用してO(n)時間で実行できます。

編集:因数分解を必要としないので、ドラコニスの答えはより良いです。数値が大きいか素数である場合、GCD計算はより高速です。


2
因数分解は非常に遅いです。私たちが知る限り、因数分解の効率的なアルゴリズムはありません。O(n)時間を要するアルゴリズムは確かにわかりません。基本的に、このアルゴリズムは指数時間(技術的には、サブ指数関数ですが、超多項式時間)に近くなります。
DW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.