Задать вопрос
@eminsk
программирую на python

В функции four_squares программа выдает ошибку как только обращается, и почему не проходит тест с этим числом 106369249365575352836589875696130383747?

И как исправить эту ошибку
Мне нужен ответ как исправить а что за ошибка я уже вкурсе.

import numba
from numba import njit, prange
from typing import Tuple
import numpy as np
from functools import lru_cache


@lru_cache(maxsize=256)
@numba.njit(parallel=True, fastmath=True, error_model='numpy')
def four_squares(n: np.int64) -> Tuple[np.int64, np.int64, np.int64, np.float64]:
    for a in prange(np.float64(n**0.5) + 1):
        for b in prange(np.float64((n - a**2)**0.5) + 1):
            for c in prange(np.float64((n - a**2 - b**2)**0.5) + 1):
                d = np.float64(np.round((n - a**2 - b**2 - c**2)**0.5))
                if a**2 + b**2 + c**2 + d**2 == n:
                    return a, b, c, d
    return np.int64(0), np.int64(0), np.int64(0), np.float64(0)


def main() -> None:
    for i in [0, 1, 17, 33, 215, 333, 2**12-3, 1234567890, 10_313_546_885_799_053_312]:
        a, b, c, d = four_squares(i)
        error_msg = None
        s = a * a + b * b + c * c + d * d
        if s != i:
            error_msg = f"Incorrect sum.\nSquares: [{a}, {b}, {c}, {d}]\nActual: {
                a * a + b * b + c * c + d * d}\nExpected: {i}"
        if error_msg is not None:
            print(error_msg)
        else:
            print("Решение принято")


if __name__ == "__main__":
    main()


Возникает ошибка
Traceback (most recent call last):
  File "c:\tradesignals\main22.py", line 35, in <module>
    main()
  File "c:\tradesignals\main22.py", line 22, in main
    a, b, c, d = four_squares(i)
                 ^^^^^^^^^^^^^^^
OverflowError: int too big to convert

c числом 1_313_546_885_799_053_312 все тесты проходят быстро
  • Вопрос задан
  • 140 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
В питоне встроенный int поддерживает длинную арифметику, поэтому с ним можно выполнять операции даже если операнды превышают 64 бита. Но это, разумеется, медленнее, чем аппаратно-поддерживаемое число.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
borisdenis
@borisdenis
Ленив и вреден...
int too big to convert

Это сообщение вам ни о чем не говорит? В int это число просто не помещается, используйте float, long или что-то подобное.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы