Advertisement
Guest User

Untitled

a guest
Jan 18th, 2019
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.70 KB | None | 0 0
  1. from math import log
  2. import datetime
  3. from mpi4py import MPI
  4. import math
  5.  
  6. comm = MPI.COMM_WORLD
  7. rank = comm.Get_rank()
  8. size = comm.Get_size()
  9. #print(size)
  10.  
  11. # Liczba pierwsza Mersenne'a
  12. M = lambda x: 2**x - 1
  13.  
  14. f = lambda x: 2**(x-1) * M(x)
  15. #print(size, rank)
  16.  
  17. # Test Lucasa-Lehmera
  18. def S(x):
  19. S = 4
  20. for i in range(2, x):
  21. S = (S**2 - 2) % M(x)
  22. return S
  23.  
  24. def perfect(n):
  25. perfect = []
  26. p = int(round((log(n, 2) + 1) / 2))
  27. s = [x for x in range(3, p + 1,2)]
  28. perfect.append([f(2), M(2)])
  29. k = math.ceil(len(s) / (size - 1))
  30. for kk in range(k):
  31. for i in range(1, size):
  32. if (kk*(size-1)+i-1)>=len(s):
  33. comm.send(0, dest=i, tag=11)
  34. elif (kk*(size-1)+i-1)>=size:
  35. comm.send(0, dest=i, tag=11)
  36. else:
  37.  
  38. comm.send(s[kk*(size-1)+i-1], dest=i, tag=11)
  39. for i in range(1, size):
  40. data = comm.recv(source=i, tag=12)
  41. if len(data)>0:
  42. perfect.append(data)
  43. return perfect
  44.  
  45. if rank == 0:
  46. start = datetime.datetime.now()
  47. s = perfect(2 ** 40)
  48. for el in s:
  49. print("Liczba doskonała :" + str(el[0]) + " i liczba Mersenne'a :" + str(el[1]))
  50. end = datetime.datetime.now()
  51. print((end - start).microseconds)
  52. elif rank > 0:
  53. while True:
  54. data = comm.recv(source=0, tag=11)
  55. if data == 0:
  56. comm.send([], dest=0, tag=12)
  57. break
  58. print(False)
  59. elif S(data) == 0:
  60. comm.send([f(data), M(data)], dest=0, tag=12)
  61. print([f(data), M(data)])
  62. else:
  63. comm.send([], dest=0, tag=12)
  64. print(False)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement