Как рассчитать log16 256-битного целого в Golang - PullRequest
0 голосов
/ 21 октября 2018

как получить журнал с основанием 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 голосов
/ 21 октября 2018

Сначала вам нужно преобразовать шестнадцатеричную строку в правильную шестнадцатеричную запись, добавив «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)))

}
0 голосов
/ 22 октября 2018

Для лог16 и шестнадцатеричного ввода существует специальный подход без длинной арифметики.

Чтобы получить целочисленный результат, просто считайте шестнадцатеричные цифры.В данном случае это 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 точных цифр

0 голосов
/ 21 октября 2018

Интересным свойством логарифмов является то, что смена базы на самом деле довольно проста.

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, - это, вероятно, реализация серии Тейлора, которую, на мой взгляд, было бы нетривиально написать.Поток, с которым я связан, указывает, что одна или несколько таких реализаций могут существовать, но не обязательно являются вычислительно правильными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...