<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: heuristic code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 05:01:05 GMT</pubDate>
    <description>DZone Snippets: heuristic code</description>
    <item>
      <title>Pollard's rho heuristic</title>
      <link>http://snippets.dzone.com/posts/show/4201</link>
      <description>Pollard's rho heuristic is a method used to find a number's factors. This is faster than the classic brute-force, try every number until sqrt(n) method, but it's results are highly unpredictable.&lt;br /&gt;&lt;br /&gt;This just prints the factors.&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 Euclid(a, b):&lt;br /&gt;  while b != 0:&lt;br /&gt;    r = a % b&lt;br /&gt;    a = b&lt;br /&gt;    b = r&lt;br /&gt;  return a&lt;br /&gt;&lt;br /&gt;def PollardRho(n):&lt;br /&gt;  i = 1&lt;br /&gt;  x = random.randint(0, n - 1)&lt;br /&gt;  y = x&lt;br /&gt;  k = 2&lt;br /&gt;  tried = set()&lt;br /&gt;  tried.add(x)&lt;br /&gt;  while True:&lt;br /&gt;    i = i + 1&lt;br /&gt;    x = (x ** 2 - 1) % n&lt;br /&gt;    if x in tried:&lt;br /&gt;      return&lt;br /&gt;    tried.add(x)&lt;br /&gt;    d = Euclid(y - x, n)&lt;br /&gt;    if d != 1 and d != n:&lt;br /&gt;      print d # d is a factor. Print it.&lt;br /&gt;    if i == k:&lt;br /&gt;      y = x&lt;br /&gt;      k = 2 * k&lt;br /&gt;&lt;br /&gt;def main(argv):&lt;br /&gt;  PollardRho(int(argv[0]))&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:52:18 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4201</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
  </channel>
</rss>
