Hi! So I was trying to create a test for numbers on primeness. But I keep getting a warning (Implicit conversion loses integer precision: 'long' to 'int') so that this doesn't run in console. Anything wrong here? Because I don't see any int in code.
//---------------------------------------------------------------------------
#include <iostream>
#include <cmath>
#include <cstdlib>
#pragma hdrstop
usingnamespace std;
//---------------------------------------------------------------------------
longlong mod( int number, longlong power, longlong n)
{
unsignedlonglong res = 1;
while (power)
{
if (power % 2)
res = (res * number) % n;
number = (number * number) % n;
power /= 2;
}
return res;
}
long NOD(long m, long n)
{
while(m!=0 && n!=0)
{
if(m>=n)
m%=n;
else
n%=m;
}
return m+n;
}
long jacob_char(long a, long b)
{
if (NOD(a, b) != 1)
return 0;
else
{
long r = 1;
if (a < 0)
{
a = -a;
if (b%4 == 3)
r = -r;
}
do
{
long t = 0;
while (a%2 == 0)
{
t += 1;
a /= 2;
}
if (t%2 != 0 && (b%8 == 3 || b%8 == 5))
r = -r;
if (a%4 == 3 && b%4 == 3)
r = -r;
long c = a;
a = b%c;
b = c;
}
while (a != 0);
return r;
}
}
int main(int argc, char* argv[])
{
long n;
long k;
long a;
double t;
int flag = 0;
cin>>n;
cin>>k;
t=1-1/pow(2.0,k);
for (int i=1; i <= k; i++)
{
a=rand()%(n-2)+2;
if (NOD(a, n) > 1)
{
flag=1;
break;
}
elseif (mod(a,(n-1)/2,n) <= jacob_char(a, n)) /*Implicit conversion loses integer precision: 'long' to 'int'*/
{
flag=2;
break;
}
}
if (flag !=0)
{
cout<<"composite \n";
}
else
cout<<"prime " << t << "\n";
return 0;
}
You appear to be implicitly converting the variable a (a long) to an int in the function call.
You also have quite a few magic numbers (2 in the above snippet) that you should consider making named constants (using meaningful variable names) to document their purposes.