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