shinenvice034
Active member
Требуется помощь в создании алгоритма, которой генерирует простое(!) число длинной от 9 и более цифр.
B правой части каждого сообщения есть стрелки ⇧ и ⇩. Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок ✔ в правой части сообщения.
Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
В каком смысле простое? Вы про что? Можно больше конкретики?
Да вроде бы всё просто:Требуется помощь в создании алгоритма, которой генерирует простое(!) число длинной от 9 и более цифр.
for target_num in range(100000000, тут указываете верхнюю границу)
primes = []
for target_num in range(100000000, 200000000):
is_prime = True
for i in range(2, target_num):
if target_num % i == 0:
is_prime = False
if is_prime:
primes.append(target_num)
print(primes)
primes = []
target_num = 100000000
while True:
is_prime = True
for i in range(2, target_num):
if target_num % i == 0:
is_prime = False
if is_prime:
primes.append(target_num)
target_num += 1
print(primes)
for i in range(2, int((target_num ** 0.5)) + 1):
import random
def generate_random_number(number_length: int = 9) -> int:
result: list = []
for _ in range(0, number_length):
result.append(f"{random.randint(0, 9)}")
if result[0] == '0':
result[0] = f"{random.randint(0, 9)}"
return int(''.join(result))
def checking_number_prime(number: int = 10) -> bool:
divisor = 2
while number % divisor != 0:
divisor += 1
return divisor == number
if __name__ == '__main__':
while True:
user_input = input('enter the length of the number: ')
if user_input.isdigit():
random_number = generate_random_number(int(user_input))
if checking_number_prime(number=random_number):
print(random_number, '- prime number')
else:
print(random_number, '- composite number')
Какой же странный у вас код.Python:def generate_random_number(number_length: int = 9): result = ''.join(["%s" % random.randint(0, 9) for _ in range(0, number_length)]) if result.isdigit(): return int(result) return result
def generate_random_number(number_length: int = 9):
return int(''.join(["%s" % random.randint(0, 9) for _ in range(0, number_length)]))
random.randint(int('1' + '0' * (number_length - 1)), int('9' * number_length))
print(type(int(10^1000000)))
Зачем нужна ещё одна переменная, а не простоrun = True
while True:
почему вы решили, что простое число это - чётное число?if number % 2 == 0:
Судя по всему пока ты писал комментарий, большинство косяков я уже и сам увидел и поправил. Это все происходит потому что, я думаю мол надо сделать проверку на ввод, написал кусочек, закинул на форум, потом начал дописывать дальше, мысль про проверку осталась, и закрутил по второму кругу ну и всякое такое, в общем спешка и невнимательность.Какой же странный у вас код.
Зря ты оправдывался, мой АКЕЛЛА. Маугли щас заступится за вожака.По поводу простых\четных, увидел только сейчас добравшись до домашнего компьютера и так же пофиксил.
Не поленился и нашёл творчество этого автора. Даже страницу нашёл и код перепечатал...Зря ты оправдывался, мой АКЕЛЛА. Маугли щас заступится за вожака.
Алгоритм от F22 также плох, как и твой.
У него даже нет никакого алгоритма, он попросту спрятался за красивыми фразами.
Если бы на основе умозаключений f22 кто-то написал алгоритм и запустил его(алгоритм) то стало-бы очевидным никудышность всего того, что представлено выше.
Между тем, решение давно рассмотрено в учебнике кандидата технических наук, доцента Златопольского Дмитрия Михайловича "Основы программирования на язые Python"
Страница 120 -121.
Во времена совка такие задачи каждый олимпиадник щёлкал в считанные минуты, а не глотал ноотропин с глицином.
from datetime import datetime
def prime_book(n):
if n == 2:
# print('Это число простое')
return n
if n % 2 == 0 and n != 2:
# print('Это число простым не является')
pass
if n % 2 == 1:
kol_del = 2 #Учитываем как делители числа 1 и n
for vdel in range(3, n//3 + 1, 2): #Рассматриваем нечетные числа
if n % vdel == 0:
kol_del = kol_del + 1
if kol_del == 2:
# print('Это число простое')
return n
# else:
# print('Это число простым не является')
def prime_new(n):
is_prime = True
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
is_prime = False
break
if is_prime:
return n
for counts in [10, 100, 1000, 10000, 20000, 40000]:
print("Диапазон поиска чисел: от 1 до", counts)
results_book = []
results_new = []
start_time_first = datetime.now()
for i in range(1, counts):
res = prime_book(i)
if res:
results_book.append(res)
print("Время Златопольского:", datetime.now() - start_time_first)
print("Количество найденных чисел:", len(results_book))
start_time_second = datetime.now()
for i in range(1, counts):
res = prime_new(i)
if res:
results_new.append(res)
print("Время нового кода:", datetime.now() - start_time_second)
print("Количество найденных чисел:", len(results_new))
print("Списки равны?", results_book == results_new)
print()
Смелости признать свою ошибку хватит?У него даже нет никакого алгоритма, он попросту спрятался за красивыми фразами.
Если бы на основе умозаключений f22 кто-то написал алгоритм и запустил его(алгоритм) то стало-бы очевидным никудышность всего того, что представлено выше.
Хватит. Мог-бы предположить, что я предвидел такую твою реакцию заранее.Смелости признать свою ошибку хватит?
И за что вы хотите извинений?Жду извинений.
from datetime import datetime
def prime_book(n):
if n == 2:
# print('Это число простое')
return n
if n % 2 == 1:
kol_del = 2 #Учитываем как делители числа 1 и n
for vdel in range(3, n//3 + 1, 2): #Рассматриваем нечетные числа
if n % vdel == 0:
kol_del = kol_del + 1
if kol_del == 2:
# print('Это число простое')
return n
# else:
# print('Это число простым не является')
def prim_book_122(n):
if n == 2:
# print('Это число простое')
return n
if n % 2 == 1:
kol_del = 2 #Учитываем как делители числа 1 и n
vdel = 3
while vdel * vdel <= n:
if n % vdel == 0:
kol_del = kol_del + 1
break
vdel = vdel + 2
if kol_del == 2:
# print('Это число простое')
return n
# else:
# print('Это число простым не является')
def prime_new(n):
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
break
else:
return n
for counts in [50000, 100000, 1000000, 2000000, 10000000]:
print("Диапазон поиска чисел: от 1 до", counts)
results_book = []
results_new = []
start_time_first = datetime.now()
for i in range(1, counts):
res = prim_book_122(i)
if res:
results_book.append(res)
print("Время Златопольского:", datetime.now() - start_time_first)
# print("Количество найденных чисел:", len(results_book))
start_time_second = datetime.now()
for i in range(1, counts):
res = prime_new(i)
if res:
results_new.append(res)
print("Время нового кода:", datetime.now() - start_time_second)
# print("Количество найденных чисел:", len(results_new))
print("Списки равны?", results_book == results_new)
print()
У него даже нет никакого алгоритма, он попросту спрятался за красивыми фразами.
У меня в отличие от тебя короны на голове нет.
Горе - математик.
И оставьте свою поганую манеру переходить на личности.Математика прошла мимо тебя, f22
Проверил, могу сказать ты не прав. Пруфы будут ниже.Могу сказать, что вы не правы.
На Больших объёмах, код приведённый мной показывает лучшие результаты. Можете проверить сами
import time
def get_runtime(func):
def wrapper(arg):
print("Диапазон поиска чисел: от 1 до", arg)
start_time = time.monotonic()
print(func(arg))
print('Время выполнения: ', time.monotonic() - start_time)
return wrapper
@get_runtime
def sieve_eratosthenes(n):
"""
Решето Эратосфена
"""
a = range(n + 1)
a = list(a)
a[1] = 0
result_list = []
i = 2
while i <= n:
if a[i] != 0:
result_list.append(a[i])
for j in range(i, n + 1, i):
a[j] = 0
i += 1
return result_list
@get_runtime
def zlatapolski_code(a):
"""
Код из книги Златопольского
"""
result = []
for n in range(a):
if n == 2:
result.append(n)
if n % 2 == 1:
kol_del = 2 # Учитываем как делители числа 1 и n
for vdel in range(3, n // 3 + 1, 2): # Рассматриваем нечетные числа
if n % vdel == 0:
kol_del = kol_del + 1
if kol_del == 2:
result.append(n)
else:
continue
return result
@get_runtime
def f22(n):
"""
Код пользователя f22
"""
primes = []
for target_num in range(1, n):
is_prime = True
for i in range(2, target_num):
if target_num % i == 0:
is_prime = False
if is_prime:
primes.append(target_num)
return primes
if __name__ == '__main__':
test_number = 100000
print('\n')
print('Решето Эратосфена')
sieve_eratosthenes(test_number)
print('\n')
print('Код из книги Златопольского')
zlatapolski_code(test_number)
print('\n')
print('Код комрада f22')
f22(test_number)
В настоящее время в математике принято не относить единицу ни к простым, ни к составным числам, так как это нарушает важную для теории чисел единственность разложения на простые множители. Последним из профессиональных математиков, кто рассматривал 1 как простое число, был Анри Лебег в 1899 году.
Немного изменил свой код, исключив чётные числа из проверки, стал ещё сильнее опережать код ЗлатопольскогоПроверил, могу сказать ты не прав. Пруфы будут ниже.
@get_runtime
def f22(n):
"""
Код пользователя f22
"""
primes = [ ]
for target_num in range(1, n):
if target_num != 2 and target_num % 2 == 0:
continue
for i in range(2, int(target_num**0.5) + 1):
if target_num % i == 0:
break
else:
primes.append(target_num)
return primes
Проверил и вот результат:Немного изменил свой код, исключив чётные числа из проверки, стал ещё сильнее опережать код Златопольского
Python:@get_runtime def f22(n): """ Код пользователя f22 """ primes = [ ] for target_num in range(1, n): if target_num != 2 and target_num % 2 == 0: continue for i in range(2, int(target_num**0.5) + 1): if target_num % i == 0: break else: primes.append(target_num) return primes
Что скажете?
Куда уж мне с Эратосфеном тягаться ))Но опять же, он будет работать медленнее чем решето
Именно это я и хотел от вам услышать. Спасибо!Да, он стал работать быстрее чем код из книги
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import math
from time import time
# https://codeby.net/threads/generacija-bolshix-prostyx-chisel-python.75268/#post-392311
# от f22
def f22():
"""
Код пользователя f22
"""
for target_num in range(1, 110000000):
if target_num != 2 and target_num % 2 == 0:
continue
for i in range(2, int(target_num**0.5) + 1):
if target_num % i == 0:
break
else:
print(target_num, "- Простое число.")
def main():
start_time = time()
f22()
print("Затраченное время: ", time() - start_time)
if __name__ == "__main__":
main()
# 109999957 Простое число
# 109999993 Простое число
# Затраченное время: 2738.3991611003876
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import math
from time import time
# https://codeby.net/threads/generacija-bolshix-prostyx-chisel-python.75268/#post-392311
# Златопольский стр. 121
def prime_book(n):
# print("Проверка числа: ", n)
k = 1 # Переменная - счётчик
x = 1 # Первый возможный делитель
while x * x <= n:
# print("Проверяю делитель :", x)
# print("Остаток от деления: ",n % x)
if n % x == 0:
k += 1 # Увеличиваем счётчик
if k > 2:
break # Если количество делителей более 2, то прекращаем цикл, так как число не простое.
x = x + 2 # Увеличиваем возможный делитель на 2, тем самым исключая из генератора чётные делители
# print("Количество делителей: ", k)
if k == 2:
print(n, "- простое число.")
# else:
# print(n, "- число составное.")
def main():
start_time = time()
for n in range(1, 110000000, 2):
prime_book(n)
print("Затраченное время: ", time() - start_time)
if __name__ == "__main__":
main()
# 109999993 - простое число.
# Затраченное время: 2550.288964509964
А на мысль об изменении кода вам не Златопольский подсказал ?Немного изменил свой код, исключив чётные числа из проверки, стал ещё сильнее опережать код Златопольского
Обучение наступательной кибербезопасности в игровой форме. Начать игру!