github.com/digdeepmining/go-atheios@v1.5.13-0.20180902133602-d5687a2e6f43/common/math/exp.go (about)

     1  // Copyright 2016 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package math
    18  
    19  import (
    20  	"math/big"
    21  
    22  	"github.com/atheioschain/go-atheios/common"
    23  )
    24  
    25  // wordSize is the size number of bits in a big.Int Word.
    26  const wordSize = 32 << (uint64(^big.Word(0)) >> 63)
    27  
    28  // Exp implement exponentiation by squaring algorithm.
    29  //
    30  // Courtesy @karalabe and @chfast
    31  func Exp(base, exponent *big.Int) *big.Int {
    32  	result := big.NewInt(1)
    33  
    34  	for _, word := range exponent.Bits() {
    35  		for i := 0; i < wordSize; i++ {
    36  			if word&1 == 1 {
    37  				common.U256(result.Mul(result, base))
    38  			}
    39  			common.U256(base.Mul(base, base))
    40  			word >>= 1
    41  		}
    42  	}
    43  	return result
    44  }