diff --git a/SieveOfEratosthenes.lua b/SieveOfEratosthenes.lua new file mode 100644 index 0000000..3c72285 --- /dev/null +++ b/SieveOfEratosthenes.lua @@ -0,0 +1,77 @@ +--luaClasses/SieveOfEratosthenes.lua +--Matthew Ellison +-- Created: 06-30-21 +--Modified: 06-30-21 +--This creates a class that uses the Sieve of Eratosthenes to generate an infinite number of primes +--[[ + Copyright (C) 2021 Matthew Ellison + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +]] + + +--Create the table +SieveOfEratosthenes = {}; +SieveOfEratosthenes.__index = SieveOfEratosthenes; + +--This is needed to create a Sieve and link the variables and functions +--It should be called before anything when creating a Sieve +function SieveOfEratosthenes:create() + local sieve = { + possiblePrime = 2; + compositeMap = {}; + }; + setmetatable(sieve, SieveOfEratosthenes); --This links the new variable with the functions from the SieveOfEratosthenes + return sieve; +end + +--This function returns the next prime number +function SieveOfEratosthenes:next() + local prime = 0; + if(self.possiblePrime > 2) then + --Loop until you find a prime number + while(self.compositeMap[self.possiblePrime] ~= nil) do + --Create the next entry for all entries in the map + for cnt = 1, #self.compositeMap[self.possiblePrime] do + local num = self.compositeMap[self.possiblePrime][cnt]; + if(self.compositeMap[self.possiblePrime + num + num] == nil) then + local tempArray = {num}; + self.compositeMap[self.possiblePrime + num + num] = tempArray; + else + table.insert(self.compositeMap[self.possiblePrime + num + num], num); + end + end + --Delete the current entry + self.compositeMap[self.possiblePrime] = nil; + --table.remove(self.compositeMap, self.possiblePrime); + self.possiblePrime = self.possiblePrime + 2; + end + --Save that the number is prime + prime = self.possiblePrime; + --Add the next entry to the prime + if(self.compositeMap[prime * 3] == nil) then + local tempArray = {prime}; + self.compositeMap[prime * 3] = tempArray; + else + table.insert(self.compositeMap[prime * 3], prime); + end + --Move on to the next possible prime + self.possiblePrime = self.possiblePrime + 2; + else + --Return 2 and move to 3 + prime = self.possiblePrime; + self.possiblePrime = self.possiblePrime + 1; + end + return prime; +end diff --git a/testSieveOfEratosthenes.lua b/testSieveOfEratosthenes.lua new file mode 100644 index 0000000..f8780a0 --- /dev/null +++ b/testSieveOfEratosthenes.lua @@ -0,0 +1,49 @@ +--luaClasses/testSieveOfEratosthenes.lua +--Matthew Ellison +-- Created: 06-30-21 +--Modified: 06-30-21 +--This tests the SieveOfEratosthenes class +--[[ + Copyright (C) 2021 Matthew Ellison + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +]] + +require "SieveOfEratosthenes" +require "Algorithms" + + +local function testSieveOfEratosthenes() + local failed = false; --Signals whether a test was failed + + --Test 1 + local sieve = SieveOfEratosthenes:create(); + local correctAnswer = {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}; + local answer = {}; + for _ = 0, 25 do + table.insert(answer, sieve:next()); + end + if(table.unpack(correctAnswer) ~= table.unpack(answer)) then + io.write("SieveOfEratosthenes failed the test\n"); + failed = true; + end + + --Print a message if all of the tests passed + if(not failed) then + io.write("SieveOfEratosthenes passed all tests\n"); + end +end + +--Test SieveOfEratosthenes +testSieveOfEratosthenes(); \ No newline at end of file