C++ prime testing


by Whovian
Tags: prime, testing
Whovian
Whovian is offline
#1
Apr4-12, 03:28 PM
P: 642
Alright. I know how incredibly inefficient this algorithm is, but I felt like giving this a whirl.

#include <iostream>
#include <cmath>
using namespace std;

bool prime(int x)
{
bool j = true;
for (double i = 2;i == x;i++)
{
if (x/i == floor(x/i))
{
j = false;
}
}
return j;
}

int main()
{
cout << prime(4) << endl;
return 0;
}

It returns "1" (true.) Why is this? Obviously, an error on my part.
Phys.Org News Partner Science news on Phys.org
Going nuts? Turkey looks to pistachios to heat new eco-city
Space-tested fluid flow concept advances infectious disease diagnoses
SpaceX launches supplies to space station (Update)
Whovian
Whovian is offline
#2
Apr4-12, 03:29 PM
P: 642
This is one of the times I wish I could delete my own threads. I used = instead of ==. Still not working. Edited the original post.
Hobin
Hobin is offline
#3
Apr4-12, 03:32 PM
P: 194
Quote Quote by Whovian View Post
This is one of the times I wish I could delete my own threads. I used = instead of ==.
Don't worry about it. It's a classic mistake.

Whovian
Whovian is offline
#4
Apr4-12, 03:39 PM
P: 642

C++ prime testing


I managed to figure the new problem out, I used == when I should've used !=. These =, ==, and != are killing me! :)
jreelawg
jreelawg is offline
#5
Apr4-12, 04:17 PM
P: 450
You can write it like this if you want.


for (double i = 2;i != x;i++)
    if (x/i == floor(x/i))
        j = false;
And you could do do it this way instead also

for (int i = 2; i != x; i++)
    if ((x % i)==0)  
        j = false;
Whovian
Whovian is offline
#6
Apr4-12, 04:23 PM
P: 642
Now, for fun, I decided to see if I could make a perfect number tester. What's wrong with this function?

bool perfect (int x)
{
	int y = 0;
	for (double i = 2;i != x;i++)
	{
		if (x/i == floor(x/i))
		{
			y = y + i;
			}
		}
	return (y == x);
	}
Whatever I input, it returns 0.

EDIT: Figured it out. *bashes head against wall* I started counting factors at 2, not 1.

EDIT: And it's still looking for 33550336.
jreelawg
jreelawg is offline
#7
Apr4-12, 04:54 PM
P: 450
Quote Quote by Whovian View Post
EDIT: And it's still looking for 33550336.
I don't know the specifics, maybe someone else can help me out about this, but I would think that a comparison between a double and an integer as a loop condition might be problematic.

Integers are exact values while doubles are approximate values.

It seams possible that as you add up i's as doubles, you might end up with a loss of precision enough that i != x when you would expect it to and you will get stuck in an infinite loop.

I just did a test and found that

2.0000000000000001==2 , but
2.000000000000001 !=2
jreelawg
jreelawg is offline
#8
Apr4-12, 05:05 PM
P: 450
I just ran a test and found this out.

int x=2;
double y=2;

for ( int i=0; i < 29; ++i){
    y+=y;  //equivalent to y=y+y;
    x+=x;
}

if (x==y) 
    cout << "yes";
Turns out that after 29 additions
x==y
, but after 30,
x!=y
If you use the modulus operator then you will have no problems

(x % i) == //The integer remainder of x/i, which is zero if i is a factor of x.
Hobin
Hobin is offline
#9
Apr4-12, 05:23 PM
P: 194
a/b == floor(a/b) is ugly to begin with. Those modulus operators don't exist for no reason.
AlephZero
AlephZero is offline
#10
Apr4-12, 05:43 PM
Engineering
Sci Advisor
HW Helper
Thanks
P: 6,344
Quote Quote by jreelawg View Post
I just ran a test and found this out.

int x=2;
double y=2;

for ( int i=0; i < 29; ++i){
    y+=y;  //equivalent to y=y+y;
    x+=x;
}

if (x==y) 
    cout << "yes";
Turns out that after 29 additions
x==y
, but after 30,
x!=y
If you print out the value of x and y at each iteration, you mgiht be surprised as to which of x and y is accurate and which is not...
... but you shouldn't really be surprised that if x is a 32-bit signed integer, it can't hold a number bigger than 231.

On the other hand a double can hold integers up to about 252 exactly, so sometimes storing integer values in doubles wins over storing them in integers.

Try the same code with "long x = 2" (if your implementation uses 64-bit long integers) to see when that falls over. Actually, it might work beyond 52 iterations, because a double can hold integer powers of 2 exactly right up to the maximum value for a double, which is bigger than 10300. But C++ it won't necessarily print those values accurately to 300 digits precision, of course.
TylerH
TylerH is offline
#11
Apr4-12, 10:20 PM
P: 737
"long long" is always at least 64 bits wide on any x86 arch, if not 128. Use long long if you need more range, but stay away from floating point numbers.

Use % to check for remainder. For example, if i % p == 0, then p divides i and i isn't prime if p is any number but i or 1.

Also, if you need guaranteed width, look at cstdint.
Hobin
Hobin is offline
#12
Apr5-12, 04:58 AM
P: 194
Quote Quote by TylerH View Post
"long long" is always at least 64 bits wide on any x86 arch, if not 128. Use long long if you need more range, but stay away from floating point numbers.
In my experience, it's 64 bits on most compilers: http://gcc.gnu.org/ml/gcc/2004-03/msg01251.html.

"64 bits ought to be anything for anyone." - Me.
Adyssa
Adyssa is offline
#13
Apr6-12, 05:15 AM
P: 186
When comparing doubles (floating point numbers in general), you should compare to within an error bound to account for small variances in precision.

Example:

double x, y;
epsilon = 0.000000005 // error bound

// some code assigning values to x and y

if(abs(x - y) < epsilon) // absolute value keeps the result of x - y positive for comparison with the error bound
{
  // they are 'equal', or close enough
}
else
{
  // they are not equal
}
Whovian
Whovian is offline
#14
Apr6-12, 09:39 AM
P: 642
Quote Quote by Hobin View Post
a/b == floor(a/b) is ugly to begin with. Those modulus operators don't exist for no reason.
Oh! Modulus! Why didn't I think of that?


Register to reply

Related Discussions
K-th Prime Proofs & Co-Prime Numbers Linear & Abstract Algebra 4
a prime number which equals prime numbers General Math 10
A formula of prime numbers for interval (q; (q+1)^2), where q is prime number. Linear & Abstract Algebra 0
Prime Numbers in the Diophantine equation q=(n^2+1)/p and p is Prime Linear & Abstract Algebra 5
Efficiency: prime test vs prime generator Linear & Abstract Algebra 14