Understanding elegant prime number tester - python

I'm new to Python and testing myself with some questions. One that came up was to test whether a user inputted number was prime or not. Easy enough, but one person came up with a single line of code as a solution.
import math
num = int(input("Enter a number greater than 2 "))
if sum([True if num%factor == 0 else False for factor in ([2] + list(range(3,int(math.sqrt(num)),2)))]):
print("Number is composite")
else:
print("Number is prime")
I understand part of it: the if statement is True if (number/iterations) gives a remainder of 0, else False, where the only iterations that need to be checked are 2 -> sqrt(number) skipping all even numbers.
However, I can't work out how to sum operator at the start of the if statement works. I assume it operates on the True(1)/False(0) statements, but how does this interaction play out and how does it affect the if/else statements?

Related

Code for Python as Prime and function [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 4 years ago.
Improve this question
Stuck on this problem and I couldn't find an answer and my code keeps failing.
Write a function called specialPrime which takes in an integer as an argument and returns True if the integer is a prime number and length of the integer squared is less than six digits, False if it is not a prime number or the integer squared is greater than six digits. Write a program which prompts the user to type in an integer and uses you specialPrime function to determine whether or not the integer is special.
Example Interaction
Enter a number: 140
140 is not a special prime number.
Enter a number: 89
89 is a special prime number.
My code
def specialPrime(isPrime,G6):
isPrime= int(input('Enter a number:')
if isPrime < 2 return False
elif isPrime == 2
return True
for n in range(2, x)
if x % n ==0:
return False
return True
G6 = len(isPrime**2)
if G6 > 6: return False
else
return True
while True
print( isPrime + 'is a special number')
else
print( isPrime + 'is not a special prime')
`
First:
Write a function called specialPrime which takes in an integer as an argument and returns True [or] False
Your function doesn't take an integer as an argument, it takes two arguments that… I'm not sure what they're intended to be, because you ignore them anyway. So, start with that. Also, give it a meaningful name. isPrime sounds like a flag that tells you whether a number is prime, or a function that figures out whether a number is prime, not a candidate number that may or may not be prime. So:
def specialPrime(number):
The next part of your code is close, but it's got problems too:
You're supposed to be testing the value you got as an argument, not some completely different value you got from input.
if, elif, for, and all other "compound statements" in Python need colons.
if, etc., statements with multi-line bodies need those bodies indented.
What is x? You were testing isPrime, and suddenly you're testing another variable that you haven't even defined anywhere.
You return True if the number is == 2, and also if it's > 2 but has no divisors between 2 and the number. That means you aren't testing the other condition; you're just assuming it's always true.
So:
if number < 2: return False
elif isPrime == 2:
pass
for n in range(2, number):
if number % n ==0:
return False
This can all be improved in multiple ways, but those are the minimal changes to make it make sense as Python code.
Next, you're trying to take the length of a number. Numbers don't have lengths. You can take the length of a string representation of a number:
digits = len(str(number**2))
if digits > 6:
… or you can do arithmetic to test the number of digits:
square = number**2
if square > 999999:
Also, notice the names digits and square, which tell you that it's a count of digits, or a square of a number, instead of G6, which tells you that it's a group of the 6 major EU countries.
Either way, you then have some of the same problems from the first block with colons and indents again, which you need to fix the same way.
Finally:
Write a program which prompts the user to type in an integer and uses you specialPrime function to determine whether or not the integer is special.
There's nothing about a while True-type loop here—it's a reasonable extension to the program, but get the basics working first.
So you need to prompt the user to type in an integer. Here is where you use input:
number = input('Enter a number:')
But the result of input is a string. If the user types 23, what you get is the string '23'. So, you need to call int to convert it:
number = int(input('Enter a number:'))
Now you have to call your function:
if specialPrime(number):
And again, you have some of the same errors with colons and indents that you need to fix.
After all of those fixes, the code will run. If there are no logic errors in your tests, it will give the right answer. If there are… well, you can debug it from there.
You could modify your code to use a couple of helper functions for each of the two requirements of special_prime(x):
def squared_less_than_six_digits(x):
return len(str(x**2)) < 6
def is_prime(x):
if x < 2:
return False
else:
for n in range(2, x):
if x % n == 0:
return False
return True
def special_prime(x):
return is_prime(x) and squared_less_than_six_digits(x)
def main():
user_input = 0
while True:
try:
user_input = int(input("Please enter an integer:"))
except ValueError:
print("Error: You did not enter a integer. Please try again.")
continue
else:
print("You entered the integer {}. Its square is {}.".format(user_input, user_input**2))
break
if special_prime(user_input):
print("It is a special prime.")
else:
print("It is not a special prime.")
if __name__ == "__main__":
main()
Try the above code out here!
Testing:
Prime number whose square is less than six digits:
Please enter an integer: 2
You entered the integer 2. Its square is 4.
It is a special prime.
Prime number whose square is greater than or equal to six digits:
Please enter an integer: 317
You entered the integer 317. Its square is 100489.
It is not a special prime.
Nonprime number whose square is less than six digits:
Please enter an integer: 1
You entered the integer 1. Its square is 1.
It is not a special prime.
Nonprime number whose square is greater than or equal to six digits:
Please enter an integer: 318
You entered the integer 318. Its square is 101124.
It is not a special prime.

My code works fine but every time the input is a prime number it keeps on printing "This is a prime number." over and over. How do I stop this?

My code is a PYTHON program that identifies if a number is prime or not. When I entered 45 however, it said that 45 was a prime, even though 45 isn't a prime number. Also, every time I run the program, it prints 'Sorry, the number you have entered is not prime.' or 'The number is indeed prime!' multiple times, instead of once. How do I make it print the output statements once and how can fix the program so that it says 45 IS NOT a prime number.
n = eval(input("Enter a number to find if that number is prime: "))
a = 2
while n > a:
if ((n % a) == 0) & (a != n):
print('Sorry, the number you have entered is not prime.')
break
else:
print('The number you have entered is indeed prime!')
Because you are printing it every time. If you want to break after finding/not finding the prime number, indent one more level for the break.
Also, this does not calculate prime numbers. It calculates if its even number.
Follow the solution here
Your code has some issues. To start with, you're never updating a, so you only ever check if the number n is even.
Once you fix that, you have two indentation problems. The first is that the break line needs to be inside the body of the if statement. Indent it more so that it's inside the if block.
The second indentation issue is more subtle. If you leave the else where it is, it will print out that the number is prime every time you test a potential factor that doesn't divide the number. That's both unhelpful (since it prints a lot) and wrong (since it says the number is prime even if it will later find a factor and say it's not prime). You can fix this by unindenting the else line so that it is lined up with the while statement. Using an else after a loop is an obscure bit of Python syntax. The body of the else only runs if the condition of the loop fails. It gets skipped if the loop exits due to a break statement.
Here's all of those necessary fixes together:
while n > a:
if ((n % a) == 0) & (a != n):
print('Sorry, the number you have entered is not prime.')
break # indent this line more!
a += 1 # increment a, so you don't keep checking 2 over and over
else: # unindent this line (and the next line too)
print('The number you have entered is indeed prime!')
There are some other things that could be improved in your code, though they aren't causing it to run incorrectly. I'd recommend using int instead of eval to parse your number, and I'd use the logical-and operator and instead of the bitwise-and operator & in the if statement (though actually you don't need either, since the a != n check is redundant, as the loop would have already ended if it was true).

creating a python program which ask the user for a number - even odd

I am new to python and I am taking a summer online class to learn python.
Unfortunately, our professor doesn't really do much. We had an assignment that wanted us to make a program (python) which asks the user for a number and it determines whether that number is even or odd. The program needs to keep asking the user for the input until the user hit zero. Well, I actually turned in a code that doesn't work and I got a 100% on my assignment. Needless to say our professor is lazy and really doesn't help much. For my own knowledge I want to know the correct way to do this!!! Here is what I have/had. I am so embarrassed because I know if probably very easy!
counter = 1
num = 1
while num != 0:
counter = counter + 1
num=int(input("Enter number:"))
while num % 2 == 0:
print ("Even", num)
else:
print ("Odd", num)
There are a couple of problems with your code:
You never use counter, even though you defined it.
You have an unnecessary nested while loop. If the number the user inputs is even, then you're code will continue to run the while loop forever.
You are incorrectly using the else clause that is available with while loops. See this post for more details.
Here is the corrected code:
while True:
# Get a number from the user.
number = int(input('enter a number: '))
# If the number is zero, then break from the while loop
# so the program can end.
if number == 0:
break
# Test if the number given is even. If so, let the
# user know the number was even.
if number % 2 == 0:
print('The number', number, 'is even')
# Otherwise, we know the number is odd. Let the user know this.
else:
print('The number', number, 'is odd')
Note that I opted above to use an infinite loop, test if the user input is zero inside of the loop, and then break, rather than testing for this condition in the loop head. In my opinion this is cleaner, but both are functionally equivalent.
You already have the part that continues until the user quits with a 0 entry. Inside that loop, all you need is a simple if:
while num != 0:
num=int(input("Enter number:"))
if num % 2 == 0:
print ("Even", num)
else:
print ("Odd", num)
I left out the counter increment; I'm not sure why that's in the program, since you never use it.
Use input() and If its only number specific input you can use int(input()) or use an If/else statement to check
Your code wasn't indented and you need to use if condition with else and not while
counter = 1
num = 1
while num != 0:
counter = counter + 1
num = int(input("Enter number:"))
if num % 2 == 0:
print ("Even", num)
else:
print ("Odd", num)
Sample Run
Enter number:1
Odd 1
Enter number:2
Even 2
Enter number:3
Odd 3
Enter number:4
Even 4
Enter number:5
Odd 5
Enter number:6
Even 6
Enter number:0
Even 0

Being told I have an infinite loop, but I'm unsure how to fix it. (Python Coding Course)

I'm currently in a python coding class and this is an assignment. I apparently have an infinite loop somewhere in my code, yet I can't seem to find it.
num = int(input("Enter a number: "))
factorial = 1
# check if the number is negative, positive or zero
if num < 0:
print("Sorry, factorial does not exist for negative numbers")
elif num == 0:
print("The factorial of 0 is 1")
else:
for i in range(1,num + 1):
factorial = factorial*i
print("The factorial of",num,"is",factorial)
# At this point the program should take your now factorial and give you the fibonacci sequence
# takes your factorial and makes it the fibonacci
nterms = factorial
# first two terms
n1 = 0
n2 = 1
count = 2
# check if the number of terms is valid
if nterms <= 0:
print("Plese enter a positive integer")
elif nterms == 1:
print("Fibonacci sequence:")
print(n1)
else:
print("Fibonacci sequence:")
print(n1,",",n2,end=', ')
while count < nterms:
nth = n1 + n2
print(nth,end=' , ')
# update values
n1 = n2
n2 = nth
count += 1
I've used both the debugging tool and attempted to find the problem myself by running the programming and attempting various break sequences but I'm just not grasping it.
There is no infinite loop in your code, both loops will finish in finite time. What is happening is that your teacher, without looking at your code, has discovered that the finite time is very, very long and mistaken this for an infinite loop.
The reason it's taking so long is that you have misunderstood the question - "I was asked to make a program that took an integer and gave me said factorial of an integer. Then give the Fibonacci sequence of the integer" - means find the factorial and Fibonacci sequence of the same integer rather than feeding the first result into the second. Simply replace the line nterms = factorial with the line nterms = num to fix the problem.
(See comments on question for additional information used in this answer)
First, you already know what a loop is and how it works. You should review the loop in your code and make sure any variable used is defined. Since this is an assignment, this is the best I can do for you, to be honest your problem is already solved.
Maybe try enclosing your code in a function with arguments/input-variables, this way your code might run smoother and better. Hope this helps.

Python Printing Prime Numbers

TASK : Write a program that prints out all the primes below 10,000.
Hint: you will need to use % which gives the remainder of a division operation.
So x=11%5 would give 1 as 11/5=2 remainder 1
I FOUND THIS CODE , can someone add annotations next to all the lines explaining what is happening.I totally don't understand this code.
numbers=[]
for i in range(0,10001):
numbers.append(" ") #We just put spaces in each box for now
numbers[0]="X"
numbers[1]="X"
firstFree=2
while firstFree<10001:
multiple=firstFree*2
while multiple<10001: #Mark all multiples of firstFree as X
numbers[multiple]='X'
multiple=multiple+firstFree
firstFree=firstFree+1
while firstFree<10000 and numbers[firstFree]=='X':
firstFree=firstFree+1
for i in range(0,10001):
if(numbers[i]!='X'):
print(i)
As you have been told, you should not learn that way. Plus, in my humble opinion, this code you have found is extremely ugly and hard to read.
This is beter example.
#Main loop, this is self explanatory.
for dividend in range(2, 10000):
#This loops through all divisors available.
for divisor in range(2, dividend):
#Check against reminder of division.
if dividend % divisor == 0:
#Prints all composites of prime number that failed against check.
print('{} equals {} * {}'.format(dividend, divisor, dividend//divisor))
#Breakes second loop.
break
#Find answer for this thing yourself. It is interesting.
else:
#Enters here when have not found division factor.
print('{} is one of the prime numbers.'.format(dividend))
Read tons of tutorials, train and learn.

Categories