main.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-"
  3. """
  4. Goldbach - 2017 - by psy (epsylon@riseup.net)
  5. You should have received a copy of the GNU General Public License along
  6. with Goldbach; if not, write to the Free Software Foundation, Inc., 51
  7. Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  8. """
  9. import os, sys
  10. import matplotlib.pyplot as plt
  11. class Goldbach(object):
  12. def __init__(self):
  13. self.l="love"
  14. self.dimX=[]
  15. self.dimY=[]
  16. def banner(self):
  17. print " ____ _ _ _ _ "
  18. print " / ___| ___ | | __| | |__ __ _ ___| |__ "
  19. print "| | _ / _ \| |/ _` | '_ \ / _` |/ __| '_ \ "
  20. print "| |_| | (_) | | (_| | |_) | (_| | (__| | | |"
  21. print " \____|\___/|_|\__,_|_.__/ \__,_|\___|_| |_|"
  22. print "\n", 75*"="
  23. print " 'Every even integer greater than 2 can"
  24. print " be expressed as the sum of two odd primes'"
  25. print 75*"=","\n"
  26. def is_prime(self, n):
  27. for i in range(3, n):
  28. if n % i == 0:
  29. return False
  30. return True
  31. def is_odd(self, n):
  32. if int(n) & 1:
  33. return True
  34. return False
  35. def is_valid_root(self, r):
  36. import random # generate pseudo-random number
  37. while True:
  38. n=(random.randint(4,100))
  39. r=self.is_odd(n)
  40. if r is False:
  41. break
  42. return n
  43. def threads(self, n):
  44. while True:
  45. n=n-1
  46. ion = self.is_odd(n)
  47. if ion is True:
  48. ipn = self.is_prime(n)
  49. if ipn is True:
  50. self.dimX.append(int(n))
  51. if n == 1:
  52. break
  53. else:
  54. pass
  55. else:
  56. pass
  57. def generate_graph(self):
  58. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  59. print "\n[Info] Generating 'plots' for number:", self.root
  60. if not os.path.exists("graphs/"):
  61. os.mkdir("graphs/")
  62. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  63. print "\n + Thread(s):", len(self.tree)
  64. print ' - Tree =', self.tree
  65. plt.figure()
  66. fig = plt.figure(1)
  67. ax = fig.add_subplot(111, facecolor='black')
  68. for t in self.tree:
  69. x = t.rsplit('=',1)[1]
  70. x = x.rsplit('+',1)[0]
  71. y = t.rsplit('+',1)[1]
  72. ax.scatter(self.tree.index(t)+1, x, color="red", s=2)
  73. ax.scatter(self.tree.index(t)+1, y, color="green", s=2)
  74. header = '"Tree" for number '+str(self.root)
  75. plt.title(header)
  76. plt.ylabel('Number(s)')
  77. plt.xlabel('Thread(s)')
  78. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  79. plt.show()
  80. g = "graphs/"+self.root
  81. if not os.path.exists(g):
  82. os.mkdir(g)
  83. f = open(g+"/"+self.root+"-Goldbach_tree.txt", 'wb')
  84. fig.savefig(g+"/"+self.root+"-Goldbach_graph.png")
  85. for t in self.tree:
  86. f.write(str(t+"\n"))
  87. f.close
  88. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  89. print "\n[Info] Generated 'tree' secuence at folder: "+g+"/\n"
  90. else:
  91. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  92. print "\n[Info] You have this 'tree' secuence previously saved...\n"
  93. ax.clear()
  94. print 75*"=", "\n"
  95. def generate_forest(self, rng):
  96. print "\n[Info] Generating 'forest' until range:", rng, "\n"
  97. rng=int(rng)
  98. for i in range(rng):
  99. i=i+1
  100. if i > 2:
  101. t = self.is_odd(i)
  102. if t is False:
  103. n = i
  104. self.root = str(n)
  105. print "[Info] Generating 'tree' for number:", self.root
  106. self.generate_tree(n)
  107. def generate_tree(self, n):
  108. s=0 # seed counter
  109. t=0 # threads counter
  110. x=0 # x counter
  111. y=0 # y counter
  112. w=False # warning flag
  113. self.tree = []
  114. try:
  115. if int(n) & 1:
  116. print "\n[Error] Number should be always an even. Aborting...\n"
  117. return
  118. else:
  119. if int(n) <= 2:
  120. print "\n[Error] Number should be always an integer > 2. Aborting...\n"
  121. return
  122. else:
  123. self.threads(n)
  124. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  125. print "\n[Info] Prime numbers detected on serie:", len(self.dimX)
  126. self.dimY = self.dimX
  127. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  128. print "\n[Info] Calculating all possible permutations...\n"
  129. for p in self.dimX:
  130. for d in self.dimY:
  131. t = t + 1
  132. r = p + d
  133. if r == n:
  134. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  135. print " Thread:" +str(t) , "->", p, "+", d, "=", r, "-> FOUND!"
  136. l = str(r)+ " = " + str(p)+" + "+str(d)
  137. if l not in self.tree:
  138. self.tree.append(l)
  139. else:
  140. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  141. print " Thread:" + str(t), "->", p, "+", d, "=", r, "-> DISCARDED..."
  142. except:
  143. print "\n[Error] Number should be always an integer > 2. Aborting...\n"
  144. return
  145. print "\n[Info] Combinations found:", str(len(self.tree)), "\n"
  146. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  147. for t in self.tree:
  148. print " ", t
  149. graph=raw_input("\nWanna generate a 'graph'? (Y/n)")
  150. if graph == "n" or graph == "N":
  151. print ""
  152. return
  153. else:
  154. self.generate_graph()
  155. else:
  156. self.generate_graph()
  157. def run(self, opts=None):
  158. self.banner()
  159. self.mode=raw_input("Set mode: single random (default), manual, learning (S/m/l): ")
  160. print 40*"-"
  161. if self.mode == "m" or self.mode == "M" or self.mode == "Manual" or self.mode == "manual": #mode manual
  162. n=raw_input("Set a number: ")
  163. try:
  164. n = int(n)
  165. except:
  166. print "\n[Error] Number should be always an even INTEGER greater than 2. Aborting...\n"
  167. sys.exit(2)
  168. elif self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn": #mode learning
  169. rng=raw_input("Set max range (ex: 100 or 9000000) (PRESS ENTER = 100) (STOP = CTRL+z): ")
  170. if not rng:
  171. rng=100
  172. else: # mode single random
  173. r=raw_input("Set max range (ex: 100 or 9000000) (PRESS ENTER = 100): ")
  174. if not r:
  175. r=100
  176. n = int(self.is_valid_root(r))
  177. if not self.mode == "l" or self.mode == "L" or self.mode == "Learn" or self.mode == "learn":
  178. self.root = str(n)
  179. print "[Info] Generating 'tree' for number:", self.root
  180. self.generate_tree(n)
  181. else:
  182. try:
  183. rng = int(rng)
  184. except:
  185. print "\n[Error] Max range should be always an even INTEGER greater than 2. Aborting...\n"
  186. sys.exit(2)
  187. if not int(rng) > 2:
  188. print "\n[Error] Max range should be always an even integer GREATER THAN 2. Aborting...\n"
  189. sys.exit(2)
  190. else:
  191. t = self.is_odd(rng)
  192. if t is True:
  193. print "\n[Error] Max range should be always an EVEN integer greater than 2. Aborting...\n"
  194. sys.exit(2)
  195. else:
  196. self.generate_forest(rng)
  197. print "[Info] 'Forest' correctly generated. Exiting...\n"
  198. if __name__ == "__main__":
  199. app = Goldbach()
  200. app.run()