Как улучшить мои медленные вложенные циклы for с помощью itertools?

#python #python-3.x #loops #nested #itertools

#python #python-3.x #циклы #вложенный #итерационные инструменты

Вопрос:

Мой код для проблемы Codewars слишком медленный, после некоторых исследований кажется, что я должен использовать продукт itertools, НО я не могу понять, как

Прямо сейчас это мой код, который работает, но, как сказано, слишком медленно.

 def list_squared(m, n):
  results = []
  for i in range (m, n):
     sum = 0
     for j in range (1, i 1):
         if i % j == 0:
             sum  = j**2
     if int(sum**(1/2))**2 == sum: #checking if number is a perfect square number
             results.append([i, sum])
  return results
 

Как мне использовать функцию prodcut из itertools здесь в этом случае?

РЕДАКТИРОВАТЬ: несколько примеров:

list_squared(1, 250) —> [[1, 1], [42, 2500], [246, 84100]]

list_squared(42, 250) —> [[42, 2500], [246, 84100]]

Я должен получить такой список. Учитывая мой ввод двух целых чисел m, n (1 <= m <= n) Я хочу найти все целые числа между m и n, сумма квадратов делителей которых сама по себе является квадратом.

Например: делители 42 равны : 1, 2, 3, 6, 7, 14, 21, 42. Эти делители в квадрате равны: 1, 4, 9, 36, 49, 196, 441, 1764. Сумма квадратов делителей равна 2500, что равно 50 * 50, квадрату!

Комментарии:

1. Приведите примеры входных данных для функции (m и n) и ожидаемые результаты

2. Извини, я виноват. Я добавил его

Ответ №1:

Если «sum ** (1/2)» означает «квадратный корень из суммы», он, вероятно, автоматически преобразуется во что-то вроде exp((1/2) * log(sum)) , который съест вас заживо. На завтрак. Без соли.

Операция по модулю i % j, вероятно, не помогает, но это, безусловно, несколько укусов комаров после того, как волки покончат с вами.

Это один из тех случаев, когда вам нужно долго и внимательно изучать свой алгоритм.

Начните с наблюдения, что набор идеальных квадратов <= n, для всех нетривиальных, намного меньше, чем набор целых чисел <= n .

(ПОДСКАЗКА: 1, 4, 9, 16, 25, 36, 49, 64, … в отличие от 1, 2, 3, …, 64, …)

Я бы также посмотрел на то, как я генерировал значения j. На первый взгляд они кажутся факторами значений i.