Python program to verify primes

  • Context: Python 
  • Thread starter Thread starter llstelle
  • Start date Start date
  • Tags Tags
    Primes Program Python
Click For Summary

Discussion Overview

The discussion revolves around a Python program designed to verify whether a given integer is a prime number. Participants address issues related to the program's performance with larger integers, code elegance, and potential improvements to the algorithm.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant reports that their program freezes when testing larger primes, suggesting a possible memory allocation issue.
  • Another participant shares a revised version of the code that addresses the initial freezing issue by correcting the conditional statements.
  • Suggestions for improvement include replacing "time.sleep(5)" with "raw_input('press enter to exit program')" to enhance user experience.
  • It is proposed to optimize the prime-checking logic by changing the condition from "if i > x/2" to "if i*i > x" to reduce unnecessary iterations.
  • A suggestion is made to check for even numbers early in the code to further optimize the algorithm, although the participant notes this may not be considered more elegant due to increased code complexity.
  • One participant points out that the check for "j != 0" appears redundant in the context of the existing logic.

Areas of Agreement / Disagreement

Participants express varying opinions on how to improve the code, with no consensus on the best approach to achieve elegance and efficiency. Some suggestions are accepted positively, while others are debated.

Contextual Notes

Participants discuss limitations related to the algorithm's efficiency and the handling of larger integers, but do not resolve these issues definitively.

llstelle
Messages
19
Reaction score
0

Homework Statement


I'm supposed to write a program which asks for an integer input, then determines if the input is a prime or not.

I wrote a program but I have 2 issues:
1) It works well for primes up to around the size of 30000~, then above that (I just tried 65537, for a weak upper bound) it just freezes... I'm guessing Python has some memory allocation issue here? Is there a solution?
2) I don't like my code. It looks ugly. Having so many nested conditionals is not elegant. And so on. Are there any tips to improve what I have written? Thanks!

2. The attempt at a solution

Here's my code...

Code:
#This program verifies if an integer is prime.

import time

x = int(raw_input('Please enter an integer.\n'))
if x == 2:
    print ('2 is a prime')
elif x < 2:
    print (str(x) + ' is not a prime.')
elif x > 3:
    i = 2
    while True:
        j = x%i
        if j == 0:
            print(str(x) + ' is not a prime.')
            time.sleep(5)
            break
        elif j != 0:
            if i > x/2:
                print(str(x) + ' is a prime.')
                time.sleep(5)
                break
            elif i < x/2:
                i = i+1
 
Last edited:
Technology news on Phys.org
OK I solved my first question, I had a mistake with the elif conditions... Here's the new code:

Code:
#This program verifies if an integer is prime.

import time

x = int(raw_input('Please enter an integer.\n'))
if x == 2:
    print ('2 is a prime')
elif x < 2:
    print (str(x) + ' is not a prime.')
else:
    i = 2
    while True:
        j = x%i
        if j == 0:
            print(str(x) + ' is not a prime.')
            time.sleep(5)
            break
        elif j != 0:
            if i > x/2:
                print(str(x) + ' is a prime.')
                time.sleep(5)
                break
            else:
                i = i+1

But I'll still appreciate if someone can let me know what improvements can be made. (:
 
Instead of "time.sleep(5)", you could use "raw_input('press enter to exit program')" to allow the user to see the results until enter is pressed before the dos console window closes.

The next two possible changes are related to knowledge of prime numbers, not of programming methods.

You could change "if i > x/2" to " if i*i > x", since there's no need to test for any prime number greater than the square root of x.

You could add a check for all even numbers, by replacing "elif x < 2", with "elif x < 2 or 0 == x%2", then start with "i = 3", and use "i = i + 2". This takes a bit more code, but reduces the number of iterations. I don't know if this would be considered more "elegant", since it's a bit more code, and modern computers are so fast that speed isn't an issue in this case.
 
Last edited:
Ah thanks for the explanations! It was really helpful. I overlooked the divisibility argument and I'll try implementing the code with reduced iterations as an exercise.

Instead of "time.sleep(5)", you could use "raw_input('press enter to exit program')" to allow the user to see the results until enter is pressed before the dos console window closes.

Oh, awesome! I've been annoyed with the time.sleep(5) for a while now, I should have thought of this, thanks!
 
Code:
        if j == 0:
            print(str(x) + ' is not a prime.')
            time.sleep(5)
            break
        elif j != 0:

That test for j != 0 seems redundant.
 

Similar threads

  • · Replies 28 ·
Replies
28
Views
5K
Replies
1
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 18 ·
Replies
18
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 97 ·
4
Replies
97
Views
10K
Replies
55
Views
7K
  • · Replies 18 ·
Replies
18
Views
3K
  • · Replies 17 ·
Replies
17
Views
2K