2 // MonoTests.Mono.Math.PrimeTestingTest.cs
7 // Copyright (c) 2003 Ben Maurer. All rights reserved
12 using Mono.Math.Prime;
13 using Mono.Math.Prime.Generator;
14 using NUnit.Framework;
16 namespace MonoTests.Mono.Math {
19 public class SearchGenerator_Test : SequentialSearchPrimeGeneratorBase {
22 public ContextData (int bits, uint testData)
24 this.bits = bits; this.testData = testData;
30 protected override BigInteger GenerateSearchBase (int bits, object Context)
32 BigInteger ret = base.GenerateSearchBase (bits, Context);
34 ContextData ctx = (ContextData)Context;
37 Assert.AreEqual (ctx.bits, bits);
38 uint d = ctx.testData;
40 for (uint i = (uint)bits - 2; d > 0; i--, d >>= 1)
41 ret.SetBit (i, (d&1) == 1);
47 public override PrimalityTest PrimalityTest {
49 return new PrimalityTest (PrimalityTests.SmallPrimeSppTest);
53 protected override bool IsPrimeAcceptable (BigInteger bi, object Context)
55 return bi.TestBit (1);
59 public void TestPrimeGeneration ()
61 Random r = new Random ();
62 for (int i = 0; i < 5; i++) {
63 ContextData ctx = new ContextData (128, (uint)r.Next (int.MinValue, int.MaxValue));
64 BigInteger p = GenerateNewPrime (128, ctx);
65 Assert.IsTrue (p.TestBit (1));
66 uint d = ctx.testData;
67 for (uint j = 128 - 2; d > 0; j--, d >>= 1)
68 Assert.AreEqual ((d&1) == 1, p.TestBit (j));