JuliaのBigIntがらみのコツをまとめた自分用メモ。
BigIntと文字列表現との相互変換
整数と文字列表現との相互変換は、↓にまとめられている。
その方法は、BigIntでも基本的に使える。
BigIntとBitArrayとの相互変換
BigIntをBitArrayに変換
下記は、BigIntに限らず、通常の整数にも使える。
例: x::BigIntをBitArrayに変換。ビット数は、xを表現するのに必要十分なビット数になる。
BitArray(digits(x,base=2))
例: x::BigIntをBitArrayに変換。ビット数を256に指定する。xが小さい値の場合、上位ビットが0で埋められる。
BitArray(digits(x,base=2,pad=256))
注: 戻り値をar::BitArrayとしたとき、xの最下位ビットがar[1]、最上位ビットがar[end]としたビット配列になる。
BitArrayをBigIntに変換
変換するための標準の関数は用意されていないみたい。
自力で書く。
それでも大したことはない。
参考:
https://discourse.julialang.org/t/parse-an-array-of-bits-bitarray-to-an-integer/42361
例: BitArrayをBigIntに変換する関数to_bigint
to_bigint(ar::BitArray) = sum(((i, x),) -> big(x) << ((i-1) * 8sizeof(x)), enumerate(ar.chunks))
ビット単位ではなく、ar.chunks
してInt単位で変換しているので速い。
注: ar[1]を最下位ビット、ar[end]を最上位ビットとしたBigIntになる。