Cómo implementar la exponenciación de un número racional y sin raíz n?
-
09-10-2019 - |
Pregunta
Su disponible para mí sólo log (base "e"), el pecado, (sólo la raíz cuadrada) bronceado y sqrt funciones y los operadores aritméticos básicos (+ - * / mod). Tengo también la "e" constante.
Estoy experimentando varios problemas con diluvio (zoho.com) para estas restricciones. Debo implementar exponenciación de bases y exponentes racionales (fracción).
Solución
Decir que desea calcular pow(A, B)
Tenga en cuenta la representación de B
en base 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))
donde b[x]
puede ser 0
o 1
y pow(2, y)
es una potencia entera de dos (es decir, 1
, 2
, 4
, 1/2
, 1/4
, 1/8
).
A continuación,
pow(A, B) = pow(A, sum(b[i] * pow(2, i)) = mul(pow(A, b[i] * pow(2, i)))
Y así pow(A, B)
se puede calcular utilizando únicamente las multiplicaciones y las operaciones de raíz cuadrada
Otros consejos
Si usted tiene una función F () que hace e ^ x, donde e es la constante, y x es cualquier número, entonces usted puede hacer esto: (a es la base, b es el exponente, ln es log-e)
a ^ b = F (b * ln (a))
Si usted no tiene F () que hace e ^ x, entonces se vuelve más complicado. Si el exponente (b) es racional, entonces debería ser capaz de encontrar enteros m y n para que b = m / n, usando un bucle de algún tipo. Una vez que tenga m y n, que hacer otro bucle que multiplica una por sí sola M veces para conseguir un ^ M y luego múltiplos una por sí mismo n veces para tener una ^ n, y se divide a ^ m / a ^ n para obtener una ^ (m / n), que es a ^ b.