Как реализовать возведение в степень рационального числа без n-го корня? - PullRequest
2 голосов
/ 14 декабря 2010

Доступны только функции log (база «e»), sin, tan и sqrt (только квадратный корень) и основные арифметические операторы (+ - * / mod).У меня также есть константа "е".

Я экспериментирую с несколькими проблемами с Deluge (zoho.com) для этих ограничений.Я должен реализовать возведение в степень рациональных (дробных) базисов и показателей степени.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2010

Скажем, вы хотите вычислить pow(A, B)

Рассмотрим представление B в базе 2:

B = b[n]   * pow(2, n    ) +
    b[n-1] * pow(2, n - 1) +
    ...
    b[2]   * pow(2, 2    ) +
    b[1]   * pow(2, 1    ) +
    b[0]   * pow(2, 0    ) +
    b[-1]  * pow(2, -1   ) +
    b[-2]  * pow(2, -2   ) +
    ...

 = sum(b[i] * pow(2, i))

, где b[x] может быть 0 или 1и pow(2, y) - целое число, равное двум (т. е. 1, 2, 4, 1/2, 1/4, 1/8).

Тогда,

pow(A, B) = pow(A, sum(b[i] * pow(2, i)) = mul(pow(A, b[i] * pow(2, i)))

И так pow(A, B) можно рассчитать, используя только умножения и операции с квадратным корнем

1 голос
/ 14 декабря 2010

Если у вас есть функция F (), которая выполняет e ^ x, где e - это константа, а x - любое число, то вы можете сделать это: (a - основание, b - показатель степени, ln - log-e)

a ^ b = F (b * ln (a))

Если у вас нет F (), который делает e ^ x, то это становится сложнее. Если ваш показатель степени (b) является рациональным, то вы должны быть в состоянии найти целые числа m и n, чтобы b = m / n, используя какой-либо цикл. Если у вас есть m и n, вы создаете еще один цикл, который умножает a на себя m раз, чтобы получить ^ m, затем умножает a на себя n раз, чтобы получить ^ n, затем делите ^ m / a ^ n, чтобы получить (м / н), который является ^ b.

...