По модулю с дробями. Фракционный класс

1

Моя цель - найти np.mod(np.array[int], some_number) для массива numpy, содержащего очень большие целые числа. Some_number является рациональным, но в целом не является точной десятичной дробью. Я хочу удостовериться, что модулю настолько точны, насколько это возможно, так как мне нужно выровнять результаты для гистограммы на более позднем этапе, поэтому любые ошибки из-за точности с плавающей запятой могут означать, что значения будут попадать в неправильный бит.

Я знаю, что функция modulo с float ограничена точностью с плавающей точкой, поэтому я не np.mod(array[int], float) использовать np.mod(array[int], float). Затем я наткнулся на модуль фракций библиотеки python. Может ли кто-нибудь дать совет относительно того, будут ли результаты, полученные с помощью np.mod(np.array[int], Fraction(int1, int2)) более точными, чем использование float? Если нет, каков наилучший подход для такой проблемы?

  • 0
    Ваш массив Numpy содержит целые числа?
  • 0
    Можете ли вы привести несколько примеров такого рода ценностей? «очень большие целые числа» немного озадачивают, поскольку NumPy обычно не предлагает dtypes больше, чем np.uint64 . У вас есть массив dtype dtype('O') ?
Показать ещё 1 комментарий
Теги:
floating-point
numpy
modulo
fractions

1 ответ

0

Итак, у вас есть доля some_number=n/d

Вычисление по модулю похоже на выполнение этого разделения:

a = q*(n/d) + (r/d)

остаток - это дробь с числителем r. Это можно сделать так:

a*d = q * n + r

Проблема в том, что a*d может переполняться. Но проблему можно написать так:

a = q1 * n + r1
d = q2 * n + r2

a*d = (q1*q2*n+q1*r2+q2*r1) * n + (r1*r2)

что n/d находится между 10 и 100, n> d, q2 = 0, r2 = d, алгоритм

  1. вычислить по модулю n => r1
  2. вычислить (r1 * d) по модулю n => r
  3. разделим г на d => по модулю n/d

Если это для ввода в бункеры, вам не нужен шаг 3.

  • 0
    Не могли бы вы немного подробнее прокомментировать, как вы переходите от уравнения для a * d к двум отдельным уравнениям для a и d?
  • 0
    1) мы разлагаем каждое слагаемое произведения a*d с евклидовым делением, 2) умножаем разложения (q1 * n + r1)*(q2 * n + r2) 3) видим, что это произведение можно записать как-то someting*n + (r1*r2) 4) r1<n и r2 < n но r1*r2 может быть> = n, поэтому мы выполняем другое деление, чтобы получить a*d по модулю n: (r1*r2)%n

Ещё вопросы

Сообщество Overcoder
Наверх
Меню