如何在Golang中计算256位整数的log16

时间:2018-10-21 16:27:29

标签: go math

如何获取以16为底的数学/大Int变量的日志。

由于我是Go语言的新手,并且来自Python和C环境,因此任何帮助都是很棒的

s := "c6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24" // Hex value
i := new(big.Int)
i.SetString(s, 16) // hex value to Big Int
// how to get the log with base 16 for a math/big Int variable.

它如何在python中工作

import math 
a = 0xc6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24
a>> 89940344608680314083397671686667731393131665861770496634981932531495305005604L
math.log(a)/math.log(16.0)

答案原来是63.908875905794794

3 个答案:

答案 0 :(得分:4)

对于log16和十六进制输入,有一种特殊的方法,无需长运算。

要获取整数(满底)结果,只需计算十六进制数字即可。在这种情况下,有63位数字,所以您有

  FloorLog16 = 63

现在获得8位数字(更多以提高精度)

  b = 0xc6d86e5a

并获取log16

 p = log(b) / log(16) = 7.908875905775919

使用此结果的小数部分使对数更精确

fp = p - Floor(p) = 0.908875905775919
log16(0xc6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24) = 
      63 + 0.908875905775919 = 63.908875905775919

注意12位数字

答案 1 :(得分:2)

对数的一个有趣特性是,基数更改实际上非常容易。

log_b (x) = log_a (x) / log_a (b)

因此,如果您想获得log_16 (x),则可以使用Log函数并更改基数:

log_e (x) = log_16 (x) / log_16 (e)
log_16 (e) = approximately 0.36067 
=> log_16 (x) = 0.36067 * log_e (x)

所以在Go中,我认为这是:

li := Log(i) * 0.36067

编辑:当我写上面的答案时,我没有意识到Log在Big Int上不起作用。读取Go Github后,由于缺少令人满意的快速解决方案,这似乎是该语言所要求的功能,尚未实现。从我阅读的内容来看,如果您必须使用Big Int,那么这似乎是目前最好的解决方案,它可能是泰勒级数实现,在我看来,编写它并非易事。我链接到的线程表示可能存在一个或多个这样的实现,但不一定在计算上正确。

答案 2 :(得分:1)

首先,您需要通过在开头添加“ 0x”来将十六进制字符串转换为正确的十六进制表示法。接下来编写一个log16方法,使用strconv获得一个整数,然后输入float64作为log方法的输入。 警告:此解决方案不处理整数溢出。

package main

import (
    "fmt"
    "math"
    "strconv"
)

func log16(x float64) float64 {
    return math.Log(x)/math.Log(16.0)   
}

func main() {
    s := "c6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24"
    s1 := "0x" + s
    h, _ := strconv.ParseInt(s1,0,64)
    fmt.Println(log16(float64(h)))

}