Python - самый быстрый способ найти все идеальные квадраты в заданном диапазоне большого числа
Я пытаюсь написать метод, чтобы получить все идеальные квадраты в заданном диапазоне в Python. Большой диапазон, например, между 2621163 и 520001400002. Теперь, очевидно, перебирая диапазон и проверяя, является ли число идеальным, вот так
def is_square(n):
return math.sqrt(n).is_integer()
и затем печатать это глупо для больших диапазонов (прекрасно работает для небольших диапазонов) и будет длиться вечно. Мне интересно, есть ли какая-нибудь магия или математика Python (скажем, модифицированное диофантово уравнение), которую я могу использовать для этой цели.
РЕДАКТИРОВАТЬ: Также я использую Python 3.X, поэтому я могу использовать большие целые числа.
6 ответов
Вы можете просто найти самые маленькие и самые большие числа, которые имеют квадраты в указанном диапазоне. Затем вы можете вернуть квадраты каждого числа в этом диапазоне.
import math
def perfect_squares(min, max):
lowest = int(math.ceil(math.sqrt(min)))
highest = int(math.sqrt(max))
return (n**2 for n in range(lowest, highest + 1))
Представьте, что число 34929456, вы можете узнать, что оно не является идеальным квадратом, например, когда оно разделено на 3: 4: 9: 2: 9: 4: 5: 6 = 42. 42 не квадратное число, так что значит 34929456 не идеальный квадрат! (Я не использую калькулятор для всего этого) Теперь мы знаем, что это не идеальный квадрат, вы округлите его вверх / вниз... Итак, вы берете последние 2 цифры, 56! Сделать 56 с однозначными цифрами - это 7(раз)8=56! 34929456 - это 8-значное число, означающее 8-7=1+4=5. Таким образом, это означает, что ответ находится между 5000 и 6000. Теперь вы немного угадываете. Давайте сделаем 5500 в квадрате = 30250000. Итак, мы знаем, что квадратный корень немного больше! Теперь давайте попробуем 5910. 5910 в квадрате = 34928100. Итак, мы знаем, что ответ между 5910 и 5911! Спасибо за прочтение!:P, надеюсь, это помогло!
получить идеальный квадрат от 1 до 100 цифр, используя NumPy
import numpy as np
a={int(np.sqrt(x)) for x in range(1,101)}
b= np.power(list(a),2)
print(a)
print(b)
Простой код Python без использования функций
import math
num=500
for i in range(1,math.ceil(math.sqrt(num))):
print(i*i)
Вы понимаете, что если вы знаете первый и последний ближайшие идеальные квадраты, остальное - это просто диапазон между ними. Я бы посчитал это так:
import math
def all_squares(a,b):#a is the starting point whereas b is the end of range
smallest = int(math.ceil(math.sqrt(a)))#perfect square closest to lower bound (rounded up)
largest = int(math.sqrt(b))#perfect square closest to upper bound (rounded down)
squares = []
for s in range(smallest, largest+1):
squares.append(s**2)
return squares
def perfect_squares(start, stop):
return (i*i for i in xrange(math.ceil(math.sqrt(start)), math.floor(math.sqrt(stop)) + 1))