Advertisement
GameNationRDF

Collatz Conjecture with matplotlib

Mar 28th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.96 KB | None | 0 0
  1. import matplotlib.pyplot as plt
  2. # init val
  3. cumulative = 0
  4. maxi = 0
  5. mini = 0
  6. maxiNum = 0
  7. miniNum = 0
  8. steps = []
  9.  
  10. # get start and end input
  11. start = int(input("Start: "))
  12. end = int(input("End: "))
  13.  
  14. # make sure they are positive integers
  15. while start <= 0 or end <= 0:
  16.     print("Please enter valid inputs...")
  17.     start = int(input("Start: "))
  18.     end = int(input("End: "))
  19.  
  20. # save size of the data set
  21. size = (end - start + 1)
  22.  
  23. # print title
  24. print("Num \tRes \tCum")
  25.  
  26. # main loop
  27. for i in range(start, end + 1):
  28.  
  29.     # init values or second loop
  30.     j = i
  31.     done = False
  32.     counter = 0
  33.  
  34.     # second loop
  35.     while not done:
  36.  
  37.         # collatz compute
  38.         if j % 2 == 0:
  39.             j /= 2
  40.         else:
  41.             j = (j * 3) + 1
  42.  
  43.         # increment counters
  44.         counter += 1
  45.         cumulative += 1
  46.  
  47.         # target reached
  48.         if j == 1:
  49.  
  50.             # set flag
  51.             done = True
  52.  
  53.             # add data to a list
  54.             steps.append(counter)
  55.  
  56.             # set maximum
  57.             if counter > maxi:
  58.                 maxi = counter
  59.                 maxiNum = i
  60.             # set minimum
  61.             if i == start:
  62.                 mini = counter
  63.                 miniNum = i
  64.             elif counter < mini:
  65.                 mini = counter
  66.                 miniNum = i
  67.  
  68.     # print the individual number
  69.     print(str(i) + "\t--\t" + str(counter) + "\t--\t" + str(cumulative))
  70.  
  71. # report stats
  72. print("\n== REPORT ==")
  73. print("MAX: " + str(maxiNum) + " required " + str(maxi) + " steps to compute.")
  74. print("MIN: " + str(miniNum) + " required " + str(mini) + " steps to compute.")
  75. print("AVG: " + "The average number of steps was: " + str(cumulative / size))
  76.  
  77. # init plot
  78. dataRange = []
  79.  
  80. for i in range(1, size + 1):
  81.     dataRange.append(i)
  82.  
  83. plt.plot(dataRange, steps)
  84. plt.show()
  85.  
  86. # partitioned average report
  87. pivot = 0
  88. avgList = []
  89. indexList = []
  90.  
  91. # loop to be able to partite same data set
  92.  
  93. # get part size from user
  94. pivot = int(input("\nEnter partition size: "))
  95.  
  96. while pivot != -1:
  97.     # divide steps into parts that have pivot number of elements each
  98.     new_size = size - (size % pivot)
  99.     parts = int(new_size / pivot)
  100.     index = 0
  101.  
  102.     # loop for every single part
  103.     for i in range(0, parts):
  104.         part_sum = 0
  105.         end_index = index + pivot
  106.  
  107.         # loop for every single element in the current part to find avg
  108.         for j in range(index,  end_index):
  109.             part_sum += steps[j]
  110.  
  111.         # calculate average
  112.         new_avg = part_sum / pivot
  113.         avgList.append(new_avg)
  114.         indexList.append(index)
  115.  
  116.         # report
  117.         print("Average of index (" + str(index) + "," + str(index + pivot) + ") is " + str(new_avg))
  118.  
  119.         # increment index by pivot to point to new part
  120.         index += pivot
  121.  
  122.     plt.clf()
  123.     plt.plot(indexList, avgList)
  124.     plt.show()
  125.  
  126.     # get part size from user
  127.     pivot = int(input("\nEnter partition size: "))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement