3

I would like to know if two integers $a$ and $b$ have at least one prime factor in common. I know calculating the GCD (by e.g. the Euclidean algorithm) would produce the right answer. However since I only care about any factor and not necessarily the largest, can it be done faster?

  • write the prime factorization of given numbers and then check. – gaurav saini Sep 09 '19 at 06:33
  • 4
    Calculating the gcd is way faster than prime factorization. – limeeattack Sep 09 '19 at 06:36
  • I don't thing there anything guarenteed faster. You could get partially through and recognize something and not have to finish but that'd just be dumb luck. Example $1421, 840$ you might recognize $840=2*420$ and $1421-420 =1001$ and you know $7|1001$ and obviously $7|42$ so we know that $7$ is a common factor. But... there's no way we can make an algorithm of that. – fleablood Sep 09 '19 at 06:45
  • If one number is easy to factor you can test the factors of it against the other. For example $306$ and $391$ it's obvious $306$ has factors of $2$ and $3$ and $391$ doesn't. If we divide $306$ by $2$ and $9$ get $153=90+63$ so $17$. If $391$ has any factor in common it's $17$ and $391-306=85$ and it's a matter of determining if $17|85$ (which it does). But again that is iffy. – fleablood Sep 09 '19 at 06:59

1 Answers1

4

This is equivalent to a fast method for detecting coprimality. (Two numbers are coprime if their GCD is $1$.) If there is a faster way to detect that their GCD is ${}>1$, without actually computing it, this is the method that would be used to detect coprimality. The current fastest method to detect coprime pairs of numbers is to compute their GCD, so there is currently no faster way known to do what you ask.

One could reduce both numbers modulo a few small primes -- this could detect a common factor without computing a GCD. And if your numbers are "randomly" chosen, then having a small factor is not rare. ($1/4$ randomly chosen pairs of integers (of some a priori bounded length) have a common factor of $2$, $1/9$ have a common factor of $3$, $1/25$ have a common factor of $5$. Summing all the squares of reciprocals of primes, we expect $45.224\dots\%$ of pairs of integers to have a common factor.) But GCDs are fast -- the same amount of time would not allow testing very many candidate prime divisors.

The time to compute the GCD of $m$ and $n$ is proportional to the time to multiple $m$ by $n$, so you expect to have time to test a small multiple of $\log (\min\{m,n\})$ primes before you spend more time on testing than on computing the GCD. Pretending the "small multiple" is $1$, this means you get to test as many primes as the number of digits in the smaller of $m$ and $n$. So for $100$ digit numbers, you only have time to test $100$ small primes before you can compute the GCD. Note that a real computer will have a different value of "small multiple" than $1$. The computer I'm typing this on takes $284\,\mu \mathrm{s}$ to test the first $100$ primes on $m,n$ pairs having $100$ digits and $6 \, \mu \mathrm{s}$ to compute their GCDs. So on this computer, that small multiple is around $1/50$. As I say, GCDs are fast.


Changed in edit: The first timings posted combined the time to generate the $m$ and $n$ pairs with the time to test primes or to compute GCDs. During the runs, generating the pairs was taking about $6\,\mu \mathrm{s}$. Consequently, both timings were reduced by the time to generate the pairs. This changed the "small multiple" from $1/20$ to $1/50$ since it roughly halved the time spent on GCDs.

Eric Towers
  • 67,037
  • Thanks for the answer. Are you able to provide a reference to "The current fastest method to detect coprime pairs of numbers is to compute their GCD"? – northerner Sep 09 '19 at 07:33
  • @northerner : https://en.wikipedia.org/wiki/Coprime_integers : "A fast way to determine whether two numbers are coprime is given by the Euclidean algorithm and its faster variants such as binary GCD algorithm or Lehmer's GCD algorithm." https://math.stackexchange.com/questions/445351/fastest-method-to-determine-if-two-numbers-are-coprime only talks about Euclidean algorithm implementations. https://stackoverflow.com/questions/1483404/what-is-the-fastest-way-to-check-if-two-given-numbers-are-coprime only discusses GCDs. – Eric Towers Sep 09 '19 at 07:37
  • If GCDs are that fast why don't we see methods of factoring based only on calculating GCDs? – user25406 Sep 09 '19 at 18:14
  • 1
    @user25406 To factor $n$ using gcds we'd need to know another integer not coprime to it. In some special cases this can be done, for example if we know a polynomial with more roots than its degree $\bmod n,,$ e.g. if we know a nontrivial square root of $,1\pmod{! n}.\ $ Some integer factoring algorithms are based on such. – Bill Dubuque Sep 09 '19 at 18:34
  • 1
    @user25406 : We do. A first step in many integer facting methods is to compute the GCD of the given number with a precomputed product of several (typically a few thousand) primes. For "randomly selected" numbers, this tends to find a factor. One downside -- it doesn't necessarily give a prime factorization, so there can still be more work to do. – Eric Towers Sep 09 '19 at 21:38
  • 1
    @user25406 : Also, using GCDs to factor has been used practically to break RSA encryption when keys were poorly chosen (to have common factors). One article about this kind of attack is http://www.loyalty.org/~schoen/rsa/ . – Eric Towers Sep 09 '19 at 21:39