#include <iostream> // entrada salida
#include <math.h> // funciones matematicas
#include <stdio.h> // printf, scanf, puts, NULL
#include <stdlib.h> // srand, rand
#include <time.h> // time
using namespace std;
//-----------------------------------------------------------------
double Power2( double k )
{
return pow ( k, 2.0 );
}
//-----------------------------------------------------------------
unsigned long Random( unsigned long a, unsigned long b )
{
unsigned long r;
// Inicializa random seed
srand ( time( NULL ) );
// Genera un numero entre a y b
r = ( rand() % ( b - a + 1 ) ) + a;
return r;
}
int primosBajos[] = { 2,3,0 };
//-----------------------------------------------------------------
bool TrialDivision( unsigned long a, unsigned long b )
{
bool noDivisible = true;
int i = 0;
do
{
if ( a % primosBajos[i] == 0 )
{
noDivisible = false;
}
i++;
} while ( ( primosBajos[i] != 0 ) && ( primosBajos[i] <= b ) && ( noDivisible == true ) );
return a;
}
//-----------------------------------------------------------------
bool PrimeTest( unsigned long a )
{
if ( a <= 3 )
{
return a > 1;
}
else if ( a % 2 == 0 || a % 3 == 0 )
{
return false;
}
else
{
for ( unsigned short i = 5; i * i <= a; i += 6 )
{
if ( a % i == 0 || a % (i + 2) == 0 )
{
return false;
}
}
return true;
}
}
//-----------------------------------------------------------------
float GenerateRelativeSize( )
{
float a;
return a;
}
//-----------------------------------------------------------------
bool CheckLemma1( unsigned long n, unsigned long a, unsigned long q )
{
return a;
}
//-----------------------------------------------------------------
void FastPrime( int k, unsigned long p )
{
const float c_opt = 0.1;
const int P0 = 10000000;
const int margin = 20;
unsigned long a, n, q, I, R;
int g;
bool success;
float relative_size;
if ( k <= P0 )
{
do
{
n = Random ( Power2( k - 1 ), Power2( k ) - 1 );
} while ( PrimeTest(n) );
p = n;
}
else
{
g = c_opt * k * k;
do
{
relative_size = GenerateRelativeSize();
} while ( k * relative_size < k - margin );
FastPrime( trunc ( relative_size * k ), q );
success = false; I = (unsigned long)Power2 ( k -1 ) / q;
do
{
R = Random ( I, 2 * I );
n = 2 * Random ( I, 2 * I ) * q + 1;
a = Random ( 2, n - 1 );
if ( TrialDivision ( n,g ) )
{
success = CheckLemma1( n, a, q );
}
} while ( !success );
p = n;
}
}
//-----------------------------------------------------------------
int main() {
// your code goes here
return 0;
}