Skip to content

Instantly share code, notes, and snippets.

@lhartikk
Created June 19, 2019 15:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lhartikk/e0e1ea1c564d77a876e6ab764f3ea5d5 to your computer and use it in GitHub Desktop.
Save lhartikk/e0e1ea1c564d77a876e6ab764f3ea5d5 to your computer and use it in GitHub Desktop.
var Prime = artifacts.require("./Prime.sol");
contract('Prime', function (accounts) {
it('reports correctly primes and composited for miller-rabin test in base2', async function () {
const contract = await Prime.new();
const isMillerRabin2Prime = (numberAsString) => contract.probablyPrime.call(numberAsString, '2')
// test for a simple prime
assert.equal(true, (await isMillerRabin2Prime('104729')));
// although 2047 is not prime the algorithm should report it as prime since 2047 is a miller-rabin pseudoprime of base 2
assert.equal(true, (await isMillerRabin2Prime('2047')));
// test primality for large numbers
assert.equal(true, (await isMillerRabin2Prime('2147483647')));
assert.equal(false, (await isMillerRabin2Prime('2147483649')));
assert.equal(true, (await isMillerRabin2Prime('1111111111111111111')));
assert.equal(false, (await isMillerRabin2Prime('1111111111111111113')));
assert.equal(true, (await isMillerRabin2Prime('10888869450418352160768000001')));
assert.equal(true, (await isMillerRabin2Prime('265252859812191058636308479999999')));
assert.equal(true, (await isMillerRabin2Prime('8683317618811886495518194401279999999')));
// cannot handle integers over 2^128
try {
await isMillerRabin2Prime('3546245297457217493590449191748546458005595187661976371');
assert.fail('error should have been thrown')
}
catch(e) {
}
// test that all primes and composites below 1000 are correctly reported
var test_primes = [ 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 ,257 ,263 ,269 ,271 ,277 ,281 ,283 ,293 ,307 ,311 ,313 ,317 ,331 ,337 ,347 ,349 ,353 ,359 ,367 ,373 ,379 ,383 ,389 ,397 ,401 ,409 ,419 ,421 ,431 ,433 ,439 ,443 ,449 ,457 ,461 ,463 ,467 ,479 ,487 ,491 ,499 ,503 ,509 ,521 ,523 ,541 ,547 ,557 ,563 ,569 ,571 ,577 ,587 ,593 ,599 ,601 ,607 ,613 ,617 ,619 ,631 ,641 ,643 ,647 ,653 ,659 ,661 ,673 ,677 ,683 ,691 ,701 ,709 ,719 ,727 ,733 ,739 ,743 ,751 ,757 ,761 ,769 ,773 ,787 ,797 ,809 ,811 ,821 ,823 ,827 ,829 ,839 ,853 ,857 ,859 ,863 ,877 ,881 ,883 ,887 ,907 ,911 ,919 ,929 ,937 ,941 ,947 ,953 ,967 ,971 ,977 ,983 ,991 ,997]
for(var i = 2; i < 1000; i++) {
const isPrime = test_primes.includes(i)
assert.equal(isPrime, (await isMillerRabin2Prime(i)), i);
}
})
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment