ho cercato di calcolare 2^100
in Golang. Comprendo lo limit of numeric type e ho provato ad usare il pacchetto math/big
. Ecco cosa ho provato ma non riesco a capire perché non funzioni.Calcolo grande elevazione a potenza in Golang
ho usato computation by powers of two metodo per calcolare l'elevamento a potenza.
package main
import (
"fmt"
"math/big"
)
func main() {
two := big.NewInt(2)
hundred := big.NewInt(50)
fmt.Printf("2 ** 100 is %d\n", ExpByPowOfTwo(two, hundred))
}
func ExpByPowOfTwo(base, power *big.Int) *big.Int {
result := big.NewInt(1)
zero := big.NewInt(0)
for power != zero {
if modBy2(power) != zero {
multiply(result, base)
}
power = divideBy2(power)
base = multiply(base, base)
}
return result
}
func modBy2(x *big.Int) *big.Int {
return big.NewInt(0).Mod(x, big.NewInt(2))
}
func divideBy2(x *big.Int) *big.Int {
return big.NewInt(0).Div(x, big.NewInt(2))
}
func multiply(x, y *big.Int) *big.Int {
return big.NewInt(0).Mul(x, y)
}
È vero. Non ha molto senso prendere due '* big.Int' come argomenti. Mi piace il tuo approccio. –
@YeLinAung in realtà se a un certo punto del tempo avrai bisogno di grandi numeri interi, puoi modificarlo facilmente per farlo. Ho scritto questa funzione solo come esempio di un giocattolo, per assicurarmi di capire l'algoritmo, ma se ho bisogno di usarlo da qualche parte nel tuo codice di produzione, piuttosto usa il metodo Exp predefinito. –
'nuova (big.Int) .exp (big.NewInt (Int64 (a)), big.NewInt (Int64 (n)), pari a zero)' è più veloce (e potrebbe essere migliorata di non realloc il risultato, come il resto delle routine 'math/big')). –