github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/math/big/int.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This file implements signed multi-precision integers. 6 7 package big 8 9 import ( 10 "github.com/shogo82148/std/math/rand" 11 ) 12 13 // Intは、符号付きの多倍長整数を表します。 14 // Intのゼロ値は値0を表します。 15 // 16 // 操作は常にポインタ引数(*Int)を取り、 17 // 各ユニークなInt値は自身のユニークな*Intポインタを必要とします。 18 // Int値を「コピー」するには、既存の(または新しく割り当てられた)Intを 19 // [Int.Set] メソッドを使用して新しい値に設定する必要があります。 20 // Intの浅いコピーはサポートされておらず、エラーを引き起こす可能性があります。 21 // 22 // メソッドは、タイミングのサイドチャネルを通じてIntの値を漏らす可能性があることに注意してください。 23 // このため、そして実装の範囲と複雑さのため、Intは暗号化操作を実装するのに適していません。 24 // 標準ライブラリは、攻撃者が制御する入力に対して非自明なIntメソッドを公開することを避け、 25 // math/bigのバグがセキュリティ脆弱性と見なされるかどうかは、標準ライブラリへの影響によって決まる可能性があります。 26 type Int struct { 27 neg bool 28 abs nat 29 } 30 31 // Signは次の値を返します: 32 // 33 // -1 は x < 0 の場合 34 // 0 は x == 0 の場合 35 // +1 は x > 0 の場合 36 func (x *Int) Sign() int 37 38 // SetInt64はzをxに設定し、zを返します。 39 func (z *Int) SetInt64(x int64) *Int 40 41 // SetUint64はzをxに設定し、zを返します。 42 func (z *Int) SetUint64(x uint64) *Int 43 44 // NewIntは新しい [Int] を割り当て、xに設定して返します。 45 func NewInt(x int64) *Int 46 47 // Setはzをxに設定し、zを返します。 48 func (z *Int) Set(x *Int) *Int 49 50 // Bitsは、xの絶対値をリトルエンディアンの [Word] スライスとして返すことで、 51 // xへの生の(チェックされていないが高速な)アクセスを提供します。結果とxは 52 // 同じ基本配列を共有します。 53 // Bitsは、このパッケージ外部で欠けている低レベルの [Int] 機能の実装をサポートすることを目的としています。 54 // それ以外の場合は避けるべきです。 55 func (x *Int) Bits() []Word 56 57 // SetBitsは、zの値をリトルエンディアンの [Word] スライスとして解釈されるabsに設定し、 58 // zを返すことで、zへの生の(チェックされていないが高速な)アクセスを提供します。 59 // 結果とabsは同じ基本配列を共有します。 60 // SetBitsは、このパッケージ外部で欠けている低レベルの [Int] 機能の実装をサポートすることを目的としています。 61 // それ以外の場合は避けるべきです。 62 func (z *Int) SetBits(abs []Word) *Int 63 64 // Absはzを|x|(xの絶対値)に設定し、zを返します。 65 func (z *Int) Abs(x *Int) *Int 66 67 // Negはzを-xに設定し、zを返します。 68 func (z *Int) Neg(x *Int) *Int 69 70 // Addはzをx+yの和に設定し、zを返します。 71 func (z *Int) Add(x, y *Int) *Int 72 73 // Subはzをx-yの差に設定し、zを返します。 74 func (z *Int) Sub(x, y *Int) *Int 75 76 // Mulはzをx*yの積に設定し、zを返します。 77 func (z *Int) Mul(x, y *Int) *Int 78 79 // MulRangeは、zを範囲[a, b](両端を含む)内のすべての整数の積に設定し、zを返します。 80 // a > b(範囲が空)の場合、結果は1です。 81 func (z *Int) MulRange(a, b int64) *Int 82 83 // Binomialは、zを二項係数C(n, k)に設定し、zを返します。 84 func (z *Int) Binomial(n, k int64) *Int 85 86 // Quoは、y != 0の場合、zを商x/yに設定し、zを返します。 87 // y == 0の場合、ゼロ除算のランタイムパニックが発生します。 88 // Quoは切り捨て除算(Goと同様)を実装します。詳細は [Int.QuoRem] を参照してください。 89 func (z *Int) Quo(x, y *Int) *Int 90 91 // Remは、y != 0の場合、zを余りx%yに設定し、zを返します。 92 // y == 0の場合、ゼロ除算のランタイムパニックが発生します。 93 // Remは切り捨てモジュラス(Goと同様)を実装します。詳細は [Int.QuoRem] を参照してください。 94 func (z *Int) Rem(x, y *Int) *Int 95 96 // QuoRemは、y != 0の場合、zを商x/yに、rを余りx%yに設定し、 97 // ペア(z, r)を返します。 98 // y == 0の場合、ゼロ除算のランタイムパニックが発生します。 99 // 100 // QuoRemはT-除算とモジュラス(Goと同様)を実装します: 101 // 102 // q = x/y 結果はゼロに切り捨てられます 103 // r = x - y*q 104 // 105 // (Daan Leijenの「コンピュータサイエンティストのための除算とモジュラス」を参照) 106 // ユークリッド除算とモジュラス(Goとは異なる)についてはDivModを参照してください。 107 func (z *Int) QuoRem(x, y, r *Int) (*Int, *Int) 108 109 // Divは、y != 0の場合、zを商x/yに設定し、zを返します。 110 // y == 0の場合、ゼロ除算のランタイムパニックが発生します。 111 // Divはユークリッド除算を実装します(Goとは異なります);詳細は [Int.DivMod] を参照してください。 112 func (z *Int) Div(x, y *Int) *Int 113 114 // Modは、y != 0の場合、zを余りx%yに設定し、zを返します。 115 // y == 0の場合、ゼロ除算のランタイムパニックが発生します。 116 // Modはユークリッドのモジュラスを実装します(Goとは異なります);詳細は [Int.DivMod] を参照してください。 117 func (z *Int) Mod(x, y *Int) *Int 118 119 // DivModは、y != 0の場合、zを商x div yに、mを余りx mod yに設定し、 120 // ペア(z, m)を返します。 121 // y == 0の場合、ゼロ除算のランタイムパニックが発生します。 122 // 123 // DivModはユークリッドの除算とモジュラスを実装します(Goとは異なります): 124 // 125 // q = x div y となるような 126 // m = x - y*q で 0 <= m < |y| 127 // 128 // (Raymond T. Boute, "The Euclidean definition of the functions 129 // div and mod". ACM Transactions on Programming Languages and 130 // Systems (TOPLAS), 14(2):127-144, New York, NY, USA, 4/1992. 131 // ACM press.を参照) 132 // T-除算とモジュラス(Goと同様)については [Int.QuoRem] を参照してください。 133 func (z *Int) DivMod(x, y, m *Int) (*Int, *Int) 134 135 // Cmpはxとyを比較し、次の値を返します: 136 // 137 // -1 は x < y の場合 138 // 0 は x == y の場合 139 // +1 は x > y の場合 140 func (x *Int) Cmp(y *Int) (r int) 141 142 // CmpAbsはxとyの絶対値を比較し、次の値を返します: 143 // 144 // -1 は |x| < |y| の場合 145 // 0 は |x| == |y| の場合 146 // +1 は |x| > |y| の場合 147 func (x *Int) CmpAbs(y *Int) int 148 149 // Int64はxのint64表現を返します。 150 // もしxがint64で表現できない場合、結果は未定義です。 151 func (x *Int) Int64() int64 152 153 // Uint64はxのuint64表現を返します。 154 // もしxがuint64で表現できない場合、結果は未定義です。 155 func (x *Int) Uint64() uint64 156 157 // IsInt64は、xがint64として表現できるかどうかを報告します。 158 func (x *Int) IsInt64() bool 159 160 // IsUint64は、xがuint64として表現できるかどうかを報告します。 161 func (x *Int) IsUint64() bool 162 163 // Float64は、xに最も近いfloat64の値と、 164 // 発生した丸め処理の有無を示す指標を返します。 165 func (x *Int) Float64() (float64, Accuracy) 166 167 // SetStringは、zを指定された基数で解釈されたsの値に設定し、 168 // zと成功を示すブール値を返します。成功するためには、文字列全体(プレフィックスだけでなく) 169 // が有効である必要があります。SetStringが失敗した場合、zの値は未定義ですが、 170 // 返される値はnilです。 171 // 172 // 基数引数は0または2から [MaxBase] の間の値でなければなりません。 173 // 基数が0の場合、数値のプレフィックスが実際の基数を決定します:プレフィックスが 174 // "0b"または"0B"は基数2を選択し、"0"、"0o"または"0O"は基数8を選択し、 175 // "0x"または"0X"は基数16を選択します。それ以外の場合、選択された基数は10であり、 176 // プレフィックスは受け付けられません。 177 // 178 // 基数が36以下の場合、小文字と大文字は同じとみなされます: 179 // 文字 'a' から 'z' と 'A' から 'Z' は、数字の値 10 から 35 を表します。 180 // 基数が36より大きい場合、大文字の 'A' から 'Z' は、数字の値 36 から 61 を表します。 181 // 182 // 基数が0の場合、アンダースコア文字 "_" は基数のプレフィックスと隣接する数字の間、 183 // または連続する数字の間に現れることがあります。このようなアンダースコアは数値の値に影響しません。 184 // アンダースコアの配置が不適切な場合、他にエラーがない場合にエラーとして報告されます。 185 // 基数が0でない場合、アンダースコアは認識されず、有効な数字でない他の任意の文字と同様に動作します。 186 func (z *Int) SetString(s string, base int) (*Int, bool) 187 188 // SetBytesは、bufをビッグエンディアンの符号なし整数のバイトとして解釈し、 189 // zをその値に設定し、zを返します。 190 func (z *Int) SetBytes(buf []byte) *Int 191 192 // Bytesは、xの絶対値をビッグエンディアンのバイトスライスとして返します。 193 // 194 // 固定長のスライスや、事前に割り当てられたものを使用するには、[Int.FillBytes] を使用します。 195 func (x *Int) Bytes() []byte 196 197 // FillBytesは、bufをxの絶対値に設定し、それをゼロ拡張のビッグエンディアンのバイトスライスとして格納し、 198 // bufを返します。 199 // 200 // もしxの絶対値がbufに収まらない場合、FillBytesはパニックを起こします。 201 func (x *Int) FillBytes(buf []byte) []byte 202 203 // BitLenは、xの絶対値の長さをビット単位で返します。 204 // 0のビット長は0です。 205 func (x *Int) BitLen() int 206 207 // TrailingZeroBitsは、|x|の連続する最下位ゼロビットの数を返します。 208 func (x *Int) TrailingZeroBits() uint 209 210 // Expは、z = x**y mod |m|(つまり、mの符号は無視されます)を設定し、zを返します。 211 // もしm == nilまたはm == 0なら、y <= 0ならz = 1、それ以外の場合はz = x**yです。 212 // もしm != 0、y < 0、そしてxとmが相互に素ではない場合、zは変更されず、nilが返されます。 213 // 214 // 特定のサイズの入力のモジュラ指数は、暗号学的に一定時間の操作ではありません。 215 func (z *Int) Exp(x, y, m *Int) *Int 216 217 // GCDは、zをaとbの最大公約数に設定し、zを返します。 218 // もしxまたはyがnilでなければ、GCDはz = a*x + b*yとなるようにそれらの値を設定します。 219 // 220 // aとbは正、ゼロ、または負のいずれかである可能性があります。(Go 1.14以前は両方とも 221 // > 0である必要がありました。)aとbの符号に関係なく、zは常に>= 0です。 222 // 223 // もしa == b == 0なら、GCDはz = x = y = 0に設定します。 224 // 225 // もしa == 0でb != 0なら、GCDはz = |b|、x = 0、y = sign(b) * 1に設定します。 226 // 227 // もしa != 0でb == 0なら、GCDはz = |a|、x = sign(a) * 1、y = 0に設定します。 228 func (z *Int) GCD(x, y, a, b *Int) *Int 229 230 // Randは、zを[0, n)の範囲の擬似乱数に設定し、zを返します。 231 // 232 // これは [math/rand] パッケージを使用しているため、 233 // セキュリティに敏感な作業には使用してはなりません。代わりに [crypto/rand.Int] を使用してください。 234 func (z *Int) Rand(rnd *rand.Rand, n *Int) *Int 235 236 // ModInverseは、zを環ℤ/nℤにおけるgの乗法的逆数に設定し、zを返します。 237 // もしgとnが互いに素でない場合、gは環ℤ/nℤに乗法的逆数を持ちません。 238 // この場合、zは変更されず、戻り値はnilです。もしn == 0なら、ゼロ除算のランタイムパニックが発生します。 239 func (z *Int) ModInverse(g, n *Int) *Int 240 241 // Jacobiは、ヤコビ記号 (x/y) を返します。これは+1、-1、または0のいずれかです。 242 // y引数は奇数でなければなりません。 243 func Jacobi(x, y *Int) int 244 245 // ModSqrtは、存在する場合、zをx mod pの平方根に設定し、zを返します。 246 // 剰余pは奇数の素数でなければなりません。もしxがp modの平方でない場合、 247 // ModSqrtはzを変更せず、nilを返します。この関数は、pが奇数でない場合にパニックを起こします。 248 // pが奇数だが素数でない場合の動作は未定義です。 249 func (z *Int) ModSqrt(x, p *Int) *Int 250 251 // Lshは、z = x << nを設定し、zを返します。 252 func (z *Int) Lsh(x *Int, n uint) *Int 253 254 // Rshは、z = x >> nを設定し、zを返します。 255 func (z *Int) Rsh(x *Int, n uint) *Int 256 257 // Bitは、xのi番目のビットの値を返します。つまり、 258 // (x>>i)&1を返します。ビットインデックスiは0以上でなければなりません。 259 func (x *Int) Bit(i int) uint 260 261 // SetBitは、xのi番目のビットをb(0または1)に設定したxをzに設定します。 262 // つまり、もしbが1なら、SetBitはz = x | (1 << i)を設定します。 263 // もしbが0なら、SetBitはz = x &^ (1 << i)を設定します。もしbが0または1でない場合、 264 // SetBitはパニックを起こします。 265 func (z *Int) SetBit(x *Int, i int, b uint) *Int 266 267 // Andは、z = x & yを設定し、zを返します。 268 func (z *Int) And(x, y *Int) *Int 269 270 // AndNotは、z = x &^ yを設定し、zを返します。 271 func (z *Int) AndNot(x, y *Int) *Int 272 273 // Orは、z = x | yを設定し、zを返します。 274 func (z *Int) Or(x, y *Int) *Int 275 276 // Xorは、z = x ^ yを設定し、zを返します。 277 func (z *Int) Xor(x, y *Int) *Int 278 279 // Notは、z = ^xを設定し、zを返します。 280 func (z *Int) Not(x *Int) *Int 281 282 // Sqrtは、zを⌊√x⌋(つまり、z² ≤ xとなる最大の整数)に設定し、zを返します。 283 // xが負の場合、パニックを起こします。 284 func (z *Int) Sqrt(x *Int) *Int