aboutsummaryrefslogtreecommitdiffstats
path: root/common/math/exp.go
blob: bd6eeb0318ff3addfd94c2b1acf3c606ce02914d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package math

import (
    "math/big"

    "github.com/ethereum/go-ethereum/common"
)

// wordSize is the size number of bits in a big.Int Word.
const wordSize = 32 << (uint64(^big.Word(0))>>63)

// Exp implement exponentiation by squaring algorithm.
//
// Courtesy @karalabe and @chfast
func Exp(base, exponent *big.Int) *big.Int {
    result := big.NewInt(1)

    for _, word := range exponent.Bits() {
        for i := 0; i < wordSize; i++ {
            if word&1 == 1 {
                common.U256(result.Mul(result, base))
            }
            common.U256(base.Mul(base, base))
            word >>= 1
        }
    }
    return result
}