Skip to content

Instantly share code, notes, and snippets.

@lhartikk
Created June 19, 2019 15:03
Show Gist options
  • Select an option

  • Save lhartikk/e0e1ea1c564d77a876e6ab764f3ea5d5 to your computer and use it in GitHub Desktop.

Select an option

Save lhartikk/e0e1ea1c564d77a876e6ab764f3ea5d5 to your computer and use it in GitHub Desktop.

Revisions

  1. lhartikk created this gist Jun 19, 2019.
    45 changes: 45 additions & 0 deletions miller-rabin-tests.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    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);
    }

    })

    });