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))
Другие вопросы по тегам