Advertisement
B1KMusic

collatz.c [optimization patch]

Aug 12th, 2016
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.13 KB | None | 0 0
  1. // Optimized version of http://pastebin.com/8EiQw3mB
  2. // Whereas the previous version took almost 10 minutes to finish 1 billion collatz paths, this one takes 11 *seconds*.
  3. // These optimizations were way more effective than I had anticipated.
  4.  
  5. // Edit: this whole program is meaningless.
  6.  
  7. #include <stdio.h>
  8.  
  9. typedef unsigned long ul;
  10.  
  11. int
  12. power_2(ul n)
  13. {
  14.     int i;
  15.     ul temp;
  16.  
  17.     for(i = 0; i < 64; i++){
  18.         temp = 1 << i;
  19.  
  20.         if(n & temp) // wait a minute. This will return true with all n > 0. Changing '&' to '==' makes it slow again. I fucked up.
  21.             return 1;
  22.     }
  23.  
  24.     return 0;
  25. }
  26.  
  27. void
  28. collatz(ul n)
  29. {
  30.     static ul largest;
  31.     ul n_cpy = n;
  32.  
  33.     while(n > 1){
  34.         if(power_2(n) || n == largest)
  35.             break;
  36.  
  37.         if(!(n % 2))
  38.             n /= 2;
  39.         else
  40.             n = (n * 3 + 1) / 2;
  41.     }
  42.  
  43.     largest = n_cpy;
  44. }
  45.  
  46. void
  47. do_collatz(ul n)
  48. {
  49.     ul i;
  50.  
  51.     for(i = 1; i < n; i++){
  52.         if(i % 1000000 == 1)
  53.             printf("collatz(%lu million)\n", i / 1000000);
  54.  
  55.         collatz(i);
  56.     }
  57. }
  58.  
  59. int
  60. main()
  61. {
  62.     do_collatz(1000000000);
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement