Как найти антилогарифм для больших значений?

Я хочу знать, как найти антилогарифм числа с плавающей запятой. Мой первый подход заключался в использовании встроенных функций, таких как exp(), pow() как в Python, так и в C, но они выдавали ошибку вне диапазона.

Затем я попытался разбить его на две части: одно целое и другое с плавающей запятой, затем вычислить 10, возвести в степень отдельно для обоих из них, а затем умножить их, чтобы получить результат. поэтому, когда я пытаюсь вычислить (a*b) в Python, он говорит: long int слишком велик для преобразования в float

Моя первоначальная задача состояла в том, чтобы вычислить антилогарифм (x)% m, и я преобразовал его (a * b)% m, где a - очень большое целое число, а b - число с плавающей запятой.

Так может ли кто-нибудь помочь мне с этим? Есть ли какое-либо модульное свойство, применимое к поплавкам? Или есть какой-нибудь «быстрый» и «эффективный» способ вычисления антилогарифма (x)?


person Prakhar Awasthi    schedule 16.11.2014    source источник
comment
на сколько огромен? Насколько точность?   -  person President James K. Polk    schedule 16.11.2014
comment
x будет около 1500... Я не уверен, но минимальное значение x будет около 700 (поскольку оно рассчитывается на промежуточном этапе моего вопроса, поэтому я не очень в этом уверен). Точность не имеет значения, так как, наконец, я хочу, чтобы мой ответ был целым числом, но это должно округляться до правильного целого числа.   -  person Prakhar Awasthi    schedule 16.11.2014


Ответы (1)


Если вам нужно вычислить (10**x)%m, не пытайтесь сначала вычислить 10**x. Функция pow принимает три аргумента:

мощность (х, у [, г])

Верните x в степень y; если z присутствует, вернуть x в степени y по модулю z (вычисляется более эффективно, чем pow(x, y) % z). Форма с двумя аргументами pow(x, y) эквивалентна использованию оператора мощности: x**y.

Это кажется идеальным для вашей проблемы. Вы хотите pow(10, x, m)

OOPS: за исключением того, что у вас есть нецелая экспонента.

Нельзя ли использовать эти равенства:

  1. a**(b+c) == a**b * a**c
  2. (a*b)%m == (a%m * b%m) % m

чтобы определить такую ​​функцию:

def bigpow(a, b, m):
    bint = int(b)
    bfrac = b - int(b)
    return (pow(a, bint, m) * ((a**bfrac)%m)) % m
person Ned Batchelder    schedule 16.11.2014
comment
Я выполнил ваше предложение на python, и оно говорит: 3-й аргумент pow() не разрешен, если все аргументы не являются целыми числами - person Prakhar Awasthi; 16.11.2014
comment
Ах, извините, я упустил из виду, что ваш показатель степени был плавающим. - person Ned Batchelder; 16.11.2014
comment
Итак, у вас есть другие предложения? - person Prakhar Awasthi; 16.11.2014
comment
Я тоже это пробовал. Например, пусть a=1000 & b=3,125 & m=24 ((a%m)*(b*m))%m = 2, но ответ должен был быть 5, потому что 3125%24=5 Модульная арифметика работает только с целыми числами. ... - person Prakhar Awasthi; 16.11.2014