Advertisement
DjSapsan

Prime multiplication

May 17th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.19 KB | None | 0 0
  1. --require "PNumber"
  2. --require "factoredNumber"
  3.  
  4. local CLASS = require "middleclass.middleclass"
  5.  
  6. fNumber256 = CLASS("fNumber256")
  7.  
  8. function fNumber256:initialize(n)
  9.   --self.decimal = n
  10.   self.primeTable = getPrimeFactorsTable(n) -- 128 = {[2]=7} ...
  11.   --self.factored = {factorize(n)}
  12. end
  13.  
  14. function fNumber256:getDecimal()
  15.   local result = 1
  16.   for k,v in pairs(self.primeTable) do
  17.     result = result*k^v
  18.   end
  19.   return result
  20. end
  21.  
  22. function fNumber256:mult(b)
  23.   for k,v in pairs(b.primeTable) do
  24.     self.primeTable[k] = (self.primeTable[k] or 0) + (b.primeTable[k] or 0)
  25.   end  
  26. end
  27.  
  28. function fNumber256:div(b)
  29.   for k,v in pairs(b.primeTable) do
  30.     self.primeTable[k] = (self.primeTable[k] or 0) - (b.primeTable[k] or 0)
  31.   end  
  32. end
  33.  
  34. local floor, infinite = math.floor, math.huge
  35. factorsTable = {}
  36.  
  37. primes = setmetatable({2,3--[[just hard-code the even special case and following number]]}, {__index = function(self, index)
  38.   if type(index) == 'number' then
  39.     for i=#self,index-1 do local dummy = self[i] end -- Precalculate previous primes to avoid building up a stack
  40.     for candidate = self[index-1] + 2--[[All primes >2 are odd]], infinite do
  41.       local half = floor(candidate/2)
  42.       for i=1,index-1 do
  43.         local div = self[i]
  44.         if div > half then rawset(self, index, candidate); return candidate end -- A number can't possibly be divisible by something greater than its half
  45.         if candidate % div == 0 then break end -- Candidate is divisible by a prime, this not prime itself
  46.       end
  47.     end
  48.   end
  49. end})
  50.  
  51. prime256table =
  52. {[0] = 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251}
  53.  
  54. inversePrime256table =
  55. {[2]=0,[3]=1,[5]=2,[7]=3,[11]=4,[13]=5,[17]=6,[19]=7,[23]=8,[29]=9,[31]=10,[37]=11,[41]=12,[43]=13,[47]=14,[53]=15,[59]=16,[61]=17,[67]=18,[71]=19,[73]=20,[79]=21,[83]=22,[89]=23,[97]=24,[101]=25,[103]=26,[107]=27,[109]=28,[113]=29,[127]=30,[131]=31,[137]=32,[139]=33,[149]=34,[151]=35,[157]=36,[163]=37,[167]=38,[173]=39,[179]=40,[181]=41,[191]=42,[193]=43,[197]=44,[199]=45,[211]=46,[223]=47,[227]=48,[229]=49,[233]=50,[239]=51,[241]=52,[251]=53}
  56.  
  57. function factorize(subject)
  58.   if subject == 1 then
  59.     return -- Can be ommitted for implicit return ;)
  60.   elseif subject > 0 then
  61.     for i=1, infinite do
  62.       local candidate = primes[i]
  63.         if subject % candidate == 0 then
  64.           return candidate, factorize(subject/candidate)
  65.         end
  66.     end
  67.   else
  68.     return nil, "Can't be bothered to look up if negative numbers have a prime factorization"
  69.   end
  70. end
  71.  
  72. ---Checks to see if a number is prime or not
  73. function isPrimeExp(n)
  74.     --primesExp={}
  75.     if n<=0 then return false end
  76.     if n<=2 then return true end
  77.     if (n%2==0) then return false end
  78.     for i=3,n/2,2 do
  79.         if (n%i==0) then return false end
  80.     end
  81.     return true
  82. end
  83.  
  84. function generateFactorsTable(n)
  85.   for i = 2, n do
  86.     factorsTable[i]={factorize(i)}
  87.   end
  88. end
  89.  
  90. function multFactoredNumber(a,b)
  91.   for i=1,#b do
  92.     a[#a+1] = b[i]
  93.   end
  94.   return a
  95. end
  96.  
  97. function getPrimeFactorsTable(n)
  98.   local t = {factorize(n)}
  99.   local result = {}
  100.   for k,v in ipairs(t) do
  101.     result[v] = (result[v] or 0)+1
  102.   end
  103.   return result
  104. end
  105.  
  106. function divideFactoredNumber(a,b)
  107.   for i=1,#b do
  108.     a[#a+1] = b[i]
  109.   end
  110.   return a
  111. end
  112.  
  113. generateFactorsTable(256)
  114.  
  115. if arg[#arg] == "-debug" then require("mobdebug").start() end
  116.  
  117. n1 = 255
  118. n2 = 123
  119.  
  120. p1 = fNumber256:new(255) -- 3x5x17
  121. p2 = fNumber256:new(123) -- 3x41
  122.  
  123. ---- test prime multiplication -----
  124. before = os.time()
  125.  
  126. for i = 1, 100000000 do
  127.   p1:mult(p2)
  128.  
  129. end
  130.  
  131. for i = 1, 100000000 do
  132.   p1:div(p2)
  133. end
  134.  
  135. after = os.time()
  136. print("answer: "..p1:getDecimal())
  137. print("prime multiplication takes ".. after - before.. " sec")
  138. --------------------------------------
  139.  
  140. ---- test regular multiplication ----- DOESNT WORK!!!!!!
  141. --[[before = os.time()
  142.  
  143. for i = 1, 100000000 do
  144.   n1 = n1 * n2
  145.  
  146. end
  147.  
  148. for i = 1, 100000000 do
  149.   n1 = n1 / n2
  150. end
  151.  
  152. after = os.time()
  153. print("answer: "..n1)
  154. print("regular multiplication takes ".. after - before.. " sec")
  155. --------------------------------------]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement