Guest User

Untitled

a guest
Sep 5th, 2018
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 1.64 KB | None | 0 0
  1. square_root_ceil(n) = ceil(Int, sqrt(n))
  2.  
  3. function factor_fermat0(n)
  4.     a = square_root_ceil(n)
  5.     while true
  6.         d = a*a-n
  7.         b = square_root_ceil(d)
  8.         if b^2 == d
  9.             return a-b, a+b
  10.         end
  11.         a += 1
  12.     end
  13. end
  14.  
  15.  function factor_fermat1(n)
  16.     a = square_root_ceil(n)
  17.     b = square_root_ceil(a^2-n)
  18.  
  19.     while a^2-b^2 != n
  20.         while a^2-b^2 < n; a += 1; end
  21.         while a^2-b^2 > n; b += 1; end
  22.     end
  23.  
  24.     return a-b, a+b
  25. end
  26.  
  27. function factor_fermat2(n)
  28.     a = square_root_ceil(n)
  29.     a2 = a^2
  30.     b = square_root_ceil(a^2-n)
  31.     b2 = b^2
  32.     while a2-b2 != n
  33.         while a2-b2 < n; a2, a = a2+a+a+1, a+1; end
  34.         while a2-b2 > n; b2, b = b2+b+b+1, b+1; end
  35.     end
  36.  
  37.     return a-b, a+b
  38. end
  39.  
  40. function factor_fermat3(n)
  41.     a = square_root_ceil(n)
  42.     a2 = a^2
  43.     c = 2*a+1
  44.     b = square_root_ceil(a^2-n)
  45.     b2 = b^2
  46.     d = 2*b+1
  47.     while a2-b2 != n
  48.         while a2-b2 < n; a2, c = a2+c, c+2 end
  49.         while a2-b2 > n; b2, d = b2+d, d+2 end
  50.     end
  51.  
  52.     return (c-d)÷2, (c+d)÷2-1
  53. end
  54.  
  55. function factor_fermat4(n)
  56.     a = square_root_ceil(n)
  57.     a2 = a^2
  58.     c = 2*a+1
  59.     b = square_root_ceil(a^2-n)
  60.     b2 = b^2
  61.     d = 2*b+1
  62.     while a2-b2 != n
  63.         while a2-b2 < n
  64.             a2 += c
  65.             c += 2
  66.         end
  67.         while a2-b2 > n
  68.             b2 += d
  69.             d += 2
  70.         end
  71.     end
  72.  
  73.     return (c-d)÷2, (c+d)÷2-1
  74. end
  75.  
  76. # import Pkg; Pkg.add("BenchmarkTools")
  77. using BenchmarkTools
  78. for f in (factor_fermat0, factor_fermat1, factor_fermat2,
  79.          factor_fermat3, factor_fermat4)
  80.     @btime $f(4736906887651)
  81. end
Advertisement
Add Comment
Please, Sign In to add comment