rendered paste body#include "libnt.h"
// Standard libraries
#include <string>
#include <iostream>
// For the BigInteger class itself.
#include "BigInteger.hh"
// For the 4 routines `easy BI/BU <=> string' and `iostream' integration.
#include "BigIntegerUtils.hh"
using namespace std;
libnt::libnt()
{
}
libnt::~libnt()
{
}
bool libnt::MillerRabin(BigInteger ulZahl)
{
// shack the devil:
srand( (BigInteger)time( NULL ) );
BigInteger ulBasis;
BigInteger ulUngerade; // eine Zahl, geteilt durch 2 != Rest 0
BigInteger uiStellen; // Stellenanzahl + 1 von ulZahl
BigInteger zero; //
BigInteger two=2;
BigInteger one=1;
BigInteger tv = 42; // The answer of all questions ;-)
BigInteger three = 3;
BigInteger ten = 10;
//BigInteger rand;
BigInteger rand_max = 2147483647;
BigInteger step1;
BigInteger step2;
int random = rand();
//rand = (BigInteger)rand();
/* ulBasis = (ulZahl-1) * rand() / (RAND_MAX + 1.0);
if(ulBasis%2 == 0)
ulBasis--;*/
ulBasis = 2;
step1 = (rand_max + three);
step2.multiply(tv,(BigInteger)random);
ulUngerade = step2/step1 ;
if(ulUngerade%two == zero)
ulUngerade--;
uiStellen = 1;
BigInteger ulBuffer = ulZahl;
while(ulBuffer > zero)
{
ulBuffer = ulBuffer/ten;
uiStellen++;
}
// ulBasis und ulZahl müssen teilerfremd sein. => ggT == 1
if(this.ggT(ulZahl, ulBasis) != one)
return false;
bool bTest1 = false;
bool bTest2 = false;
// Teste Zahlen durch:
// Test 1:
if(pow(ulBasis, ulUngerade)%ulZahl != one)
bTest1 = true;
// Test 2:
for(BigInteger t = 0; t < uiStellen; t++)
{
BigInteger ulPow = pow(two, t);
ulPow = ulPow * ulUngerade;
if((BigInteger)pow(ulBasis, ulPow)%ulZahl != -1)
bTest2 = true;
else
bTest2 = false;
}
if(bTest1 && bTest2)
return true;
else
return false;
}
BigInteger libnt::pow(BigInteger base, BigInteger exp)
{
BigInteger nTemp = base;
for(BigInteger i=0; i<=exp; i++)
nTemp*=base;
return nTemp;
}
BigInteger libnt::ggT(BigInteger m, BigInteger n)
{
BigInteger iBuffer;
BigInteger zero;
while (n > zero)
{
iBuffer = n;
n = m%n; // Rest aus m/n
m = iBuffer; // m = altes n
}
return m;
}
BigInteger libnt::bigSqrt(BigInteger a)
{
BigInteger x = 1;
BigInteger y = 1;
BigInteger x1 = 1;
BigInteger y1 = 1;
BigInteger z = 0;
BigInteger nRef = 0;
BigInteger erg1 = 0;
BigInteger erg2 = 0;
BigInteger two = 2;
BigInteger nTemp = 10;
nRef = a/two;
x =a;
while(x!=nRef)
{
x1=x+y;
x1=x1 / two;
y1=a/x1;
x=x1;
y=y1;
nRef=x;
}
return x;
}