<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: miller code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 03:07:54 GMT</pubDate>
    <description>DZone Snippets: miller code</description>
    <item>
      <title>Miller-Rabin primality test</title>
      <link>http://snippets.dzone.com/posts/show/4200</link>
      <description>The Miller-Rabin primality test.&lt;br /&gt;&lt;br /&gt;MillerRabin(n, s = 1000) -&gt; bool Checks whether n is prime or not. This is an extremley fast algorithm designed to test &lt;strong&gt;very large&lt;/strong&gt; numbers.&lt;br /&gt;&lt;br /&gt;s is the number of tests to perform. The chance that Rabin-Miller is mistaken about a number (i.e. thinks it's prime, but it's not) is 2^(-s). So, a value of 50 for s is more than enough for any imaginable goal (2^(-50) is 8.8817841970012523e-16).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import sys&lt;br /&gt;import random&lt;br /&gt;&lt;br /&gt;def toBinary(n):&lt;br /&gt;  r = []&lt;br /&gt;  while (n &gt; 0):&lt;br /&gt;    r.append(n % 2)&lt;br /&gt;    n = n / 2&lt;br /&gt;  return r&lt;br /&gt;&lt;br /&gt;def test(a, n):&lt;br /&gt;  """&lt;br /&gt;  test(a, n) -&gt; bool Tests whether n is complex.&lt;br /&gt;&lt;br /&gt;  Returns:&lt;br /&gt;    - True, if n is complex.&lt;br /&gt;    - False, if n is probably prime.&lt;br /&gt;  """&lt;br /&gt;  b = toBinary(n - 1)&lt;br /&gt;  d = 1&lt;br /&gt;  for i in xrange(len(b) - 1, -1, -1):&lt;br /&gt;    x = d&lt;br /&gt;    d = (d * d) % n&lt;br /&gt;    if d == 1 and x != 1 and x != n - 1:&lt;br /&gt;      return True # Complex&lt;br /&gt;    if b[i] == 1:&lt;br /&gt;      d = (d * a) % n&lt;br /&gt;  if d != 1:&lt;br /&gt;    return True # Complex&lt;br /&gt;  return False # Prime&lt;br /&gt;&lt;br /&gt;def MillerRabin(n, s = 50):&lt;br /&gt;  """&lt;br /&gt;    MillerRabin(n, s = 1000) -&gt; bool Checks whether n is prime or not&lt;br /&gt;&lt;br /&gt;    Returns:&lt;br /&gt;      - True, if n is probably prime.&lt;br /&gt;      - False, if n is complex.&lt;br /&gt;  """&lt;br /&gt;  for j in xrange(1, s + 1):&lt;br /&gt;    a = random.randint(1, n - 1)&lt;br /&gt;    if (test(a, n)):&lt;br /&gt;      return False # n is complex&lt;br /&gt;  return True # n is prime&lt;br /&gt;&lt;br /&gt;def main(argv):&lt;br /&gt;  print MillerRabin(int(argv[0]), int(argv[1]))&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;  main(sys.argv[1:])&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 24 Jun 2007 16:01:11 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4200</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
  </channel>
</rss>
