main.py 8.6 KB

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