Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --require "PNumber"
- --require "factoredNumber"
- local CLASS = require "middleclass.middleclass"
- fNumber256 = CLASS("fNumber256")
- function fNumber256:initialize(n)
- --self.decimal = n
- self.primeTable = getPrimeFactorsTable(n) -- 128 = {[2]=7} ...
- --self.factored = {factorize(n)}
- end
- function fNumber256:getDecimal()
- local result = 1
- for k,v in pairs(self.primeTable) do
- result = result*k^v
- end
- return result
- end
- function fNumber256:mult(b)
- for k,v in pairs(b.primeTable) do
- self.primeTable[k] = (self.primeTable[k] or 0) + (b.primeTable[k] or 0)
- end
- end
- function fNumber256:div(b)
- for k,v in pairs(b.primeTable) do
- self.primeTable[k] = (self.primeTable[k] or 0) - (b.primeTable[k] or 0)
- end
- end
- local floor, infinite = math.floor, math.huge
- factorsTable = {}
- primes = setmetatable({2,3--[[just hard-code the even special case and following number]]}, {__index = function(self, index)
- if type(index) == 'number' then
- for i=#self,index-1 do local dummy = self[i] end -- Precalculate previous primes to avoid building up a stack
- for candidate = self[index-1] + 2--[[All primes >2 are odd]], infinite do
- local half = floor(candidate/2)
- for i=1,index-1 do
- local div = self[i]
- if div > half then rawset(self, index, candidate); return candidate end -- A number can't possibly be divisible by something greater than its half
- if candidate % div == 0 then break end -- Candidate is divisible by a prime, this not prime itself
- end
- end
- end
- end})
- prime256table =
- {[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}
- inversePrime256table =
- {[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}
- function factorize(subject)
- if subject == 1 then
- return -- Can be ommitted for implicit return ;)
- elseif subject > 0 then
- for i=1, infinite do
- local candidate = primes[i]
- if subject % candidate == 0 then
- return candidate, factorize(subject/candidate)
- end
- end
- else
- return nil, "Can't be bothered to look up if negative numbers have a prime factorization"
- end
- end
- ---Checks to see if a number is prime or not
- function isPrimeExp(n)
- --primesExp={}
- if n<=0 then return false end
- if n<=2 then return true end
- if (n%2==0) then return false end
- for i=3,n/2,2 do
- if (n%i==0) then return false end
- end
- return true
- end
- function generateFactorsTable(n)
- for i = 2, n do
- factorsTable[i]={factorize(i)}
- end
- end
- function multFactoredNumber(a,b)
- for i=1,#b do
- a[#a+1] = b[i]
- end
- return a
- end
- function getPrimeFactorsTable(n)
- local t = {factorize(n)}
- local result = {}
- for k,v in ipairs(t) do
- result[v] = (result[v] or 0)+1
- end
- return result
- end
- function divideFactoredNumber(a,b)
- for i=1,#b do
- a[#a+1] = b[i]
- end
- return a
- end
- generateFactorsTable(256)
- if arg[#arg] == "-debug" then require("mobdebug").start() end
- n1 = 255
- n2 = 123
- p1 = fNumber256:new(255) -- 3x5x17
- p2 = fNumber256:new(123) -- 3x41
- ---- test prime multiplication -----
- before = os.time()
- for i = 1, 100000000 do
- p1:mult(p2)
- end
- for i = 1, 100000000 do
- p1:div(p2)
- end
- after = os.time()
- print("answer: "..p1:getDecimal())
- print("prime multiplication takes ".. after - before.. " sec")
- --------------------------------------
- ---- test regular multiplication ----- DOESNT WORK!!!!!!
- --[[before = os.time()
- for i = 1, 100000000 do
- n1 = n1 * n2
- end
- for i = 1, 100000000 do
- n1 = n1 / n2
- end
- after = os.time()
- print("answer: "..n1)
- print("regular multiplication takes ".. after - before.. " sec")
- --------------------------------------]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement