I am writing a python program to find and return a list of Twin primes between two numbers.
This is my code:
#prime selector
def is_prime(num): #Determines whether a number is prime by checking divisibility up to its square root.
# any num less that 2 is not a prime
if num < 2:
return False
# 2 is a special case, the only even prime number
if num == 2:
return True
# even numbers > 2 are not primes
if num % 2 == 0:
return False
upr_lmt = int((num ** 0.5) + 1)
# only need to check divisors up to the square root of given number
for number in range(3, upr_lmt, 2):
# Check only odd numbers starting from 3
if num % number == 0:
return False
return True
def primeLister(end_point, st_point = 2):#Generates a list of prime numbers between st_point and end_point.
primeList = []
for i in range(st_point, end_point + 1):
if is_prime(i):
primeList.append(i)
return primeList
def Twin_Primes(a, b): #Finds and returns a list of twin primes between a and b, with each pair listed in ascending order.
prime_list = primeLister(b, a)
size = len(prime_list)
twin_prime_list = []
for i in range(size - 1):
num1, num2 = prime_list[i], prime_list[i + 1]
if num2 - num1 == 2:
twin_prime = (num1, num2)
twin_prime_list.append(twin_prime)
if len(twin_prime_list) == 0:
return ["<NONE>"]
return twin_prime_list
It is saved as prime_selector.py in a folder.
This is the testcase that I have written:
# Test case
from prime_selector import is_prime
from prime_selector import primeLister
from prime_selector import Twin_Primes
import time
import os
import threading
def measure_time():
return time.perf_counter()
def log_newline(file_writer):
file_writer.write("nn")
def log_testcase(case_num, case_desc, result, file_writer):
file_writer.write(f"================= Test Case {case_num + 1} =================n")
print((f"================= Test Case {case_num + 1} ================="))
file_writer.write(case_desc)
print(case_desc, end = "")
file_writer.write(result)
print(result)
def log_time(case_num, duration, file_writer):
file_writer.write(f"Time taken for Test Case {case_num + 1} : {duration:.10f} seconds")
print(f"Time taken for Test Case {case_num + 1} : {duration:.10f} seconds")
def clear_screen():
#time.sleep(30)
if os.name == 'nt':
_ = os.system('cls')
else:
_ = os.system('clear')
def long_running_task():
while True:
main_start_time = measure_time()
num_list = [2,3,5,7,9,15,24,4,13,90,17,27,19,100,99991,999999937,1,10]
#num_list.remove(999999937)
# Start of testing for is_prime()
with open("./is_prime_testcase","w") as file_writer:
for case_num, i in enumerate(num_list):
sub_time_start = measure_time()
case_desc = f"Is {i} a Prime Number?n"
result = f" > Yes, it is.n" if is_prime(i) else f" > No, it is not.n"
log_testcase(case_num,case_desc,result,file_writer)
duration = measure_time() - sub_time_start
log_time(case_num, duration, file_writer)
if case_num + 1 != len(num_list):
log_newline(file_writer)
clear_screen()
# Start of testing for primeLister()
with open("./primeLister_testcase","w") as file_writer:
for case_num, i in enumerate(num_list):
sub_time_start = measure_time()
case_desc = f"Listing all prime numbers till {i}:n"
result = "".join([f" > {prime}n" for prime in primeLister(i)])
log_testcase(case_num, case_desc, result, file_writer)
duration = measure_time() - sub_time_start
log_time(case_num, duration, file_writer)
if case_num + 1 != len(num_list):
log_newline(file_writer)
clear_screen()
# Start of testing for Twin_Primes()
with open("./Twin_Primes_testcase","w") as file_writer:
for case_num in range(len(num_list) - 1):
sub_time_start = measure_time()
number1, number2 = num_list[case_num], num_list[case_num + 1]
case_desc = f"Listing all Twin Prime number pairs between {number1} and {number2}:n"
result = "".join([f" > {twin}n" for twin in Twin_Primes(number1, number2)])
log_testcase(case_num, case_desc, result, file_writer)
duration = measure_time() - sub_time_start
log_time(case_num, duration, file_writer)
if case_num + 2 != len(num_list):
log_newline(file_writer)
clear_screen()
main_end_time = measure_time()
print(f"Time taken for the testcase as a whole: {main_end_time-main_start_time:.3f} seconds")
pass
t = threading.Thread(target=long_running_task)
t.start()
The testcase is also saved in the same folder locally.
The program stops abruptly during the execution of primeLister
testcase after writing the primes up to 99991 in the file.
I guess that it stops during the process of listing primes between 99991 and 999999937. I’ve got no idea why.
My computer has an Intel i5-12450H processor with 16GB RAM. If that’s relevant.
I have already tried implementing an infinite loop, threading and also using exception handling. Nothing has worked so far. What am I doing wrong?
I was expecting the program to keep executing until it found all the primes within the provided range.
Kshitij Jha is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.