[インデックス 1030] ファイルの概要
このコミットは、Go言語の初期のbignum
パッケージ、すなわち任意精度算術(多倍長整数)を扱うライブラリに対するものです。bignum
パッケージは、通常のプリミティブ型では表現できない非常に大きな整数を扱うための基本的な算術演算(加算、減算、乗算、除算、剰余など)を提供します。このファイルbignum.go
は、その中核となる実装を含んでいます。bignum_test.go
は、これらの算術演算が正しく機能することを検証するためのテストコードです。
コミット
このコミットは、多倍長整数の除算および剰余演算のアルゴリズムを高速化し、コードベースをリファクタリングしてクリーンアップすることを目的としています。具体的には、内部的な演算単位を20ビットから30ビットに変更することで、除算/剰余演算の効率を向上させています。また、多数の新しいテストが追加され、ライブラリとしての完成度を高めています。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/78b0013a07cc24557f3887a89cde283fe0c664ef
元コミット内容
commit 78b0013a07cc24557f3887a89cde283fe0c664ef
Author: Robert Griesemer <gri@golang.org>
Date: Mon Nov 3 09:21:10 2008 -0800
- changed general div/mod implementation to a faster algorithm
(operates on 30bit values at a time instead of 20bit values)
- refactored and cleaned up lots of code
- more tests
- close to check-in as complete library
R=r
OCL=18326
CL=18326
---
usr/gri/bignum/bignum.go | 557 ++++++++++++++++++++++++------------------
usr/gri/bignum/bignum_test.go | 44 +++-
2 files changed, 367 insertions(+), 234 deletions(-)
diff --git a/usr/gri/bignum/bignum.go b/usr/gri/bignum/bignum.go
index 0821720048..0852f42262 100755
--- a/usr/gri/bignum/bignum.go
+++ b/usr/gri/bignum/bignum.go
@@ -38,22 +38,18 @@ const LogB = LogW - LogH;
const (
- L3 = LogB / 3;
- B3 = 1 << L3;
- M3 = B3 - 1;
-
- L2 = L3 * 2;
+ L2 = LogB / 2;
B2 = 1 << L2;
M2 = B2 - 1;
- L = L3 * 3;
+ L = L2 * 2;
B = 1 << L;
M = B - 1;
)
type (
- Digit3 uint32;
+ Digit2 uint32;
Digit uint64;
)
@@ -69,26 +65,205 @@ func assert(p bool) {
}
-func IsSmall(x Digit) bool {
- return x < 1<<LogH;
+// ----------------------------------------------------------------------------
+// Raw operations
+
+func And1(z, x *[]Digit, y Digit) {
+ for i := len(x) - 1; i >= 0; i-- {
+ z[i] = x[i] & y;
+ }
}
-func Split(x Digit) (Digit, Digit) {
- return x>>L, x&M;
+func And(z, x, y *[]Digit) {
+ for i := len(x) - 1; i >= 0; i-- {
+ z[i] = x[i] & y[i];
+ }
}
-export func Dump(x *[]Digit) {
- print("[", len(x), "]");
+func Or1(z, x *[]Digit, y Digit) {
for i := len(x) - 1; i >= 0; i-- {
- print(" ", x[i]);
+ z[i] = x[i] | y;
}
- println();
}
-export func Dump3(x *[]Digit3) {
+func Or(z, x, y *[]Digit) {
+ for i := len(x) - 1; i >= 0; i-- {
+ z[i] = x[i] | y[i];
+ }
+}
+
+
+func Xor1(z, x *[]Digit, y Digit) {
+ for i := len(x) - 1; i >= 0; i-- {
+ z[i] = x[i] ^ y;
+ }
+}
+
+
+func Xor(z, x, y *[]Digit) {
+ for i := len(x) - 1; i >= 0; i-- {
+ z[i] = x[i] ^ y[i];
+ }
+}
+
+
+func Add1(z, x *[]Digit, c Digit) Digit {
+ n := len(x);
+ for i := 0; i < n; i++ {
+ t := c + x[i];
+ c, z[i] = t>>L, t&M
+ }
+ return c;
+}
+
+
+func Add(z, x, y *[]Digit) Digit {
+ var c Digit;
+ n := len(x);
+ for i := 0; i < n; i++ {
+ t := c + x[i] + y[i];
+ c, z[i] = t>>L, t&M
+ }
+ return c;
+}
+
+
+func Sub1(z, x *[]Digit, c Digit) Digit {
+ n := len(x);
+ for i := 0; i < n; i++ {
+ t := c + x[i];
+ c, z[i] = Digit(int64(t)>>L), t&M; // arithmetic shift!
+ }
+ return c;
+}
+
+
+func Sub(z, x, y *[]Digit) Digit {
+ var c Digit;
+ n := len(x);
+ for i := 0; i < n; i++ {
+ t := c + x[i] - y[i];
+ c, z[i] = Digit(int64(t)>>L), t&M; // arithmetic shift!
+ }
+ return c;
+}
+
+
+// Returns c = x*y div B, z = x*y mod B.
+func Mul11(x, y Digit) (Digit, Digit) {
+ // Split x and y into 2 sub-digits each (in base sqrt(B)),
+ // multiply the digits separately while avoiding overflow,
+ // and return the product as two separate digits.
+
+ const L0 = (L + 1)/2;
+ const L1 = L - L0;
+ const DL = L0 - L1; // 0 or 1
+ const b = 1<<L0;
+ const m = b - 1;
+
+ // split x and y into sub-digits
+ // x = (x1*b + x0)
+ // y = (y1*b + y0)
+ x1, x0 := x>>L0, x&m;
+ y1, y0 := y>>L0, y&m;
+
+ // x*y = t2*b^2 + t1*b + t0
+ t0 := x0*y0;
+ t1 := x1*y0 + x0*y1;
+ t2 := x1*y1;
+
+ // compute the result digits but avoid overflow
+ // z = z1*B + z0 = x*y
+ z0 := (t1<<L0 + t0)&M;
+ z1 := t2<<DL + (t1 + t0>>L0)>>L1;
+
+ return z1, z0;
+}
+
+
+func Mul(z, x, y *[]Digit) {
+ n := len(x);
+ m := len(y);
+ for j := 0; j < m; j++ {
+ d := y[j];
+ if d != 0 {
+ c := Digit(0);
+ for i := 0; i < n; i++ {
+ // z[i+j] += c + x[i]*d;
+ z1, z0 := Mul11(x[i], d);
+ t := c + z[i+j] + z0;
+ c, z[i+j] = t>>L, t&M;
+ c += z1;
+ }
+ z[n+j] = c;
+ }
+ }
+}
+
+
+func Mul1(z, x *[]Digit2, y Digit2) Digit2 {
+ n := len(x);
+ var c Digit;
+ f := Digit(y);
+ for i := 0; i < n; i++ {
+ t := c + Digit(x[i])*f;
+ c, z[i] = t>>L2, Digit2(t&M2);
+ }
+ return Digit2(c);
+}
+
+
+func Div1(z, x *[]Digit2, y Digit2) Digit2 {
+ n := len(x);
+ var c Digit;
+ d := Digit(y);
+ for i := n-1; i >= 0; i-- {
+ t := c*B2 + Digit(x[i]);
+ c, z[i] = t%d, Digit2(t/d);
+ }
+ return Digit2(c);
+}
+
+
+func Shl(z, x *[]Digit, s uint) Digit {
+ assert(s <= L);
+ n := len(x);
+ var c Digit;
+ for i := 0; i < n; i++ {
+ c, z[i] = x[i] >> (L-s), x[i] << s & M | c;
+ }
+ return c;
+}
+
+
+func Shr(z, x *[]Digit, s uint) Digit {
+ assert(s <= L);
+ n := len(x);
+ var c Digit;
+ for i := n - 1; i >= 0; i-- {
+ c, z[i] = x[i] << (L-s) & M, x[i] >> s | c;
+ }
+ return c;
+}
+
+
+// ----------------------------------------------------------------------------
+// Support
+
+func IsSmall(x Digit) bool {
+ return x < 1<<LogH;
+}
+
+
+func Split(x Digit) (Digit, Digit) {
+ return x>>L, x&M;
+}
+
+
+export func Dump(x *[]Digit) {
print("[", len(x), "]");
for i := len(x) - 1; i >= 0; i-- {
print(" ", x[i]);
@@ -140,7 +315,7 @@ func Normalize(x *Natural) *Natural {
}
-func Normalize3(x *[]Digit3) *[]Digit3 {
+func Normalize2(x *[]Digit2) *[]Digit2 {
n := len(x);
for n > 0 && x[n - 1] == 0 { n-- }
if n < len(x) {
@@ -150,9 +325,10 @@ func Normalize3(x *[]Digit3) *[]Digit3 {
}
-func (x *Natural) IsZero() bool {
- return len(x) == 0;
-}
+// Predicates
+
+func (x *Natural) IsZero() bool { return len(x) == 0; }
+func (x *Natural) IsOdd() bool { return len(x) > 0 && x[0]&1 != 0; }
func (x *Natural) Add(y *Natural) *Natural {
@@ -161,13 +337,10 @@ func (x *Natural) Add(y *Natural) *Natural {
if n < m {
return y.Add(x);
}
- assert(n >= m);
- z := new(Natural, n + 1);
-
- c := Digit(0);
- for i := 0; i < m; i++ { c, z[i] = Split(c + x[i] + y[i]); }
- for i := m; i < n; i++ { c, z[i] = Split(c + x[i]); }
- z[n] = c;
+ z := new(Natural, n + 1);
+ c := Add(z[0 : m], x[0 : m], y);
+ z[n] = Add1(z[m : n], x[m : n], c);
return Normalize(z);
}
@@ -176,19 +349,15 @@ func (x *Natural) Sub(y *Natural) *Natural {
func (x *Natural) Sub(y *Natural) *Natural {
n := len(x);
m := len(y);
- assert(n >= m);
- z := new(Natural, n);
-
- c := Digit(0);
- for i := 0; i < m; i++ {
- t := c + x[i] - y[i];
- c, z[i] = Digit(int64(t)>>L), t&M; // arithmetic shift!
+ if n < m {
+ panic("underflow")
}
- for i := m; i < n; i++ {
- t := c + x[i];
- c, z[i] = Digit(int64(t)>>L), t&M; // arithmetic shift!
+
+ z := new(Natural, n);
+ c := Sub(z[0 : m], x[0 : m], y);
+ if Sub1(z[m : n], x[m : n], c) != 0 {
+ panic("underflow");
}
- assert(c == 0); // x.Sub(y) must be called with x >= y
return Normalize(z);
}
@@ -207,56 +376,12 @@ func (x* Natural) MulAdd1(a, c Digit) *Natural {
}
-// Returns c = x*y div B, z = x*y mod B.
-func Mul1(x, y Digit) (Digit, Digit) {
- // Split x and y into 2 sub-digits each (in base sqrt(B)),
- // multiply the digits separately while avoiding overflow,
- // and return the product as two separate digits.
-
- const L0 = (L + 1)/2;
- const L1 = L - L0;
- const DL = L0 - L1; // 0 or 1
- const b = 1<<L0;
- const m = b - 1;
-
- // split x and y into sub-digits
- // x = (x1*b + x0)
- // y = (y1*b + y0)
- x1, x0 := x>>L0, x&m;
- y1, y0 := y>>L0, y&m;
-
- // x*y = t2*b^2 + t1*b + t0
- t0 := x0*y0;
- t1 := x1*y0 + x0*y1;
- t2 := x1*y1;
-
- // compute the result digits but avoid overflow
- // z = z1*B + z0 = x*y
- z0 := (t1<<L0 + t0)&M;
- z1 := t2<<DL + (t1 + t0>>L0)>>L1;
-
- return z1, z0;
-}
-
-
func (x *Natural) Mul(y *Natural) *Natural {
n := len(x);
m := len(y);
- z := new(Natural, n + m);
-
- for j := 0; j < m; j++ {
- d := y[j];
- if d != 0 {
- c := Digit(0);
- for i := 0; i < n; i++ {
- // z[i+j] += c + x[i]*d;
- z1, z0 := Mul1(x[i], d);
- c, z[i+j] = Split(c + z[i+j] + z0);
- c += z1;
- }
- z[n+j] = c;
- }
- }
+ z := new(Natural, n + m);
+ Mul(z, x, y);
return Normalize(z);
}
@@ -294,42 +419,26 @@ func (x *Natural) Pow(n uint) *Natural {
}
-func Shl1(x, c Digit, s uint) (Digit, Digit) {
- assert(s <= LogB);
- return x >> (LogB - s), x << s & M | c
-}
-
-
-func Shr1(x, c Digit, s uint) (Digit, Digit) {
- assert(s <= LogB);
- return x << (LogB - s) & M, x >> s | c
-}
-
-
func (x *Natural) Shl(s uint) *Natural {
- n := len(x);
- tsi := int(s / LogB);
- s = s % LogB;
- z := new(Natural, n + si + 1);
+ n := uint(len(x));
+ m := n + s/L;
+ z := new(Natural, m+1);
- c := Digit(0);
- for i := 0; i < n; i++ { c, z[i+si] = Shl1(x[i], c, s); }
- z[n+si] = c;
+ z[m] = Shl(z[m-n : m], x, s%L);
return Normalize(z);
}
func (x *Natural) Shr(s uint) *Natural {
- n := len(x);
- tsi := int(s / LogB);
- if si >= n { si = n; }
- s = s % LogB;
- assert(si <= n);
- z := new(Natural, n - si);
+ n := uint(len(x));
+ m := n - s/L;
+ if m > n { // check for underflow
+ m = 0;
+ }
+ z := new(Natural, m);
- c := Digit(0);
- for i := n - 1; i >= si; i-- { c, z[i-si] = Shr1(x[i], c, s); }
+ Shr(z, x[n-m : n], s%L);
return Normalize(z);
}
@@ -337,68 +446,36 @@ func (x *Natural) Shr(s uint) *Natural {
// DivMod needs multi-precision division which is not available if Digit
// is already using the largest uint size. Split base before division,\n-// and merge again after. Each Digit is split into 3 Digit3\'s.\n+// and merge again after. Each Digit is split into 2 Digit2\'s.\n
-func SplitBase(x *Natural) *[]Digit3 {
- // TODO Use Log() for better result - don\'t need Normalize3 at the end!\n+func Unpack(x *Natural) *[]Digit2 {
+ // TODO Use Log() for better result - don\'t need Normalize2 at the end!\n n := len(x);
- z := new([]Digit3, n*3 + 1); // add space for extra digit (used by DivMod)\n- for i, j := 0, 0; i < n; i, j = i+1, j+3 {\n+ z := new([]Digit2, n*2 + 1); // add space for extra digit (used by DivMod)\n+ for i := 0; i < n; i++ {\n t := x[i];
- z[j+0] = Digit3(t >> (L3*0) & M3);\n- z[j+1] = Digit3(t >> (L3*1) & M3);\n- z[j+2] = Digit3(t >> (L3*2) & M3);\n+ z[i*2] = Digit2(t & M2);\n+ z[i*2 + 1] = Digit2(t >> L2 & M2);\n }\n- return Normalize3(z);\n+ return Normalize2(z);\
}
-func MergeBase(x *[]Digit3) *Natural {
- i := len(x);
- j := (i+2)/3;\n- z := new(Natural, j);\n-
- switch i%3 {\n- case 1: z[j-1] = Digit(x[i-1]); i--; j--;\n- case 2: z[j-1] = Digit(x[i-1])<<L3 | Digit(x[i-2]); i -= 2; j--;\n- case 0:\n+func Pack(x *[]Digit2) *Natural {
+ n := (len(x) + 1) / 2;\n+ z := new(Natural, n);\n+ if len(x) & 1 == 1 {\n+ // handle odd len(x)\n+ n--;\n+ z[n] = Digit(x[n*2]);\n }\n-
- for i >= 3 {\n- z[j-1] = ((Digit(x[i-1])<<L3) | Digit(x[i-2]))<<L3 | Digit(x[i-3]);\n- i -= 3;\n- j--;\n+ for i := 0; i < n; i++ {\n+ z[i] = Digit(x[i*2 + 1]) << L2 | Digit(x[i*2]);\n }\n- assert(j == 0);\n-
return Normalize(z);
}
-func Split3(x Digit) (Digit, Digit3) {
- return uint64(int64(x)>>L3), Digit3(x&M3)\n}\n\n\nfunc Product(x *[]Digit3, y Digit) {
- n := len(x);\n- c := Digit(0);\n- for i := 0; i < n; i++ { c, x[i] = Split3(c + Digit(x[i])*y) }\n- assert(c == 0);\n}\n\n\nfunc Quotient(x *[]Digit3, y Digit) {
- n := len(x);\n- c := Digit(0);\n- for i := n-1; i >= 0; i-- {
- t := c*B3 + Digit(x[i]);
- c, x[i] = t%y, Digit3(t/y);\n- }\n- assert(c == 0);\n}\n\n\n // Division and modulo computation - destroys x and y. Based on the\n // algorithms described in:\n //\n@@ -413,8 +490,8 @@ func Quotient(x *[]Digit3, y Digit) {\n // is described in 1), while 2) provides the background for a more\n // accurate initial guess of the trial digit.\n \n-func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\n- const b = B3;\n+func DivMod2(x, y *[]Digit2) (*[]Digit2, *[]Digit2) {\n+ const b = B2;\n \n n := len(x);\n m := len(y);\n@@ -424,14 +501,9 @@ func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\n \n if m == 1 {\n // division by single digit\n- \t\td := Digit(y[0]);
- \t\tc := Digit(0);
- \t\tfor i := n; i > 0; i-- {
- \t\t\tt := c*b + Digit(x[i-1]);
- \t\t\tc, x[i] = t%d, Digit3(t/d);
- \t\t}
- \t\tx[0] = Digit3(c);
-
+\t\t// result is shifted left by 1 in place!\n+\t\tx[0] = Div1(x[1 : n+1], x[0 : n], y[0]);\n+\t\t\n } else if m > n {\n // quotient = 0, remainder = x\n // TODO in this case we shouldn\'t even split base - FIX THIS\n@@ -444,24 +516,34 @@ func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\n \n // normalize x and y\n f := b/(Digit(y[m-1]) + 1);\n- Product(x, f);\n- Product(y, f);\n+ Mul1(x, x, Digit2(f));\n+ Mul1(y, y, Digit2(f));\n assert(b/2 <= y[m-1] && y[m-1] < b); // incorrect scaling\n \n- d2 := Digit(y[m-1])*b + Digit(y[m-2]);\n+ y1, y2 := Digit(y[m-1]), Digit(y[m-2]);\n+ d2 := Digit(y1)*b + Digit(y2);\n for i := n-m; i >= 0; i-- {\n \tk := i+m;\n \t\n \t// compute trial digit\n- \t\tr3 := (Digit(x[k])*b + Digit(x[k-1]))*b + Digit(x[k-2]);\n- \t\tq := r3/d2;\n- \t\tif q >= b { q = b-1 }\n+\t\t\tvar q Digit;\n+\t\t\t{\t// Knuth\n+\t\t\t\tx0, x1, x2 := Digit(x[k]), Digit(x[k-1]), Digit(x[k-2]);\n+\t\t\t\tif x0 != y1 {\n+\t\t\t\t\tq = (x0*b + x1)/y1;\n+\t\t\t\t} else {\n+\t\t\t\t\tq = b-1;\n+\t\t\t\t}\n+\t\t\t\tfor y2 * q > (x0*b + x1 - y1*q)*b + x2 {\n+\t\t\t\t\tq--\n+\t\t\t\t}\n+\t\t\t}\n \t\n \t// subtract y*q\n \t\tc := Digit(0);\n \t\tfor j := 0; j < m; j++ {\n \t\t\tt := c + Digit(x[i+j]) - Digit(y[j])*q; // arithmetic shift!\n- \t\t\t\tc, x[i+j] = Digit(int64(t)>>L3), Digit3(t&M3);\n+ \t\t\t\tc, x[i+j] = Digit(int64(t)>>L2), Digit2(t&M2);\n \t\t}\n \t\t\n \t\t// correct if trial digit was too large\n@@ -469,18 +551,20 @@ func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\n \t\t\t// add y\n \t\t\tc := Digit(0);\n \t\t\tfor j := 0; j < m; j++ {\n- \t\t\t\tc, x[i+j] = Split3(c + Digit(x[i+j]) + Digit(y[j]));\n+ \t\t\t\tt := c + Digit(x[i+j]) + Digit(y[j]);\n+ \t\t\t\tc, x[i+j] = uint64(int64(t) >> L2), Digit2(t & M2)\n \t\t\t}\n \t\t\tassert(c + Digit(x[k]) == 0);\n \t\t\t// correct trial digit\n \t\t\tq--;\n \t\t}\n \t\t\n- \t\tx[k] = Digit3(q);\n+ \t\tx[k] = Digit2(q);\n \t}\n \t\n \t// undo normalization for remainder\n- \tQuotient(x[0 : m], f);\n+ \tc := Div1(x[0 : m], x[0 : m], Digit2(f));\n+ \tassert(c == 0);\n }\n }\n \n return x[m : n+1], x[0 : m];\n@@ -488,14 +572,20 @@ func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\n \n \n func (x *Natural) Div(y *Natural) *Natural {\n- q, r := DivMod(SplitBase(x), SplitBase(y));\n- return MergeBase(q);\n+ q, r := DivMod2(Unpack(x), Unpack(y));\n+ return Pack(q);\n }\n \n \n func (x *Natural) Mod(y *Natural) *Natural {\
- q, r := DivMod(SplitBase(x), SplitBase(y));\n- return MergeBase(r);\n+ q, r := DivMod2(Unpack(x), Unpack(y));\n+ return Pack(r);\n+}\n+\n+\n+func (x *Natural) DivMod(y *Natural) (*Natural, *Natural) {\n+ q, r := DivMod2(Unpack(x), Unpack(y));\n+ return Pack(q), Pack(r);\n }\n \n \n@@ -520,17 +610,17 @@ func (x *Natural) Cmp(y *Natural) int {\n }\n \n \n-func Log1(x Digit) int {\n+func Log2(x Digit) int {\n n := -1;\n for x != 0 { x = x >> 1; n++; } // BUG >>= broken for uint64\n return n;\n }\n \n \n-func (x *Natural) Log() int {\
+func (x *Natural) Log2() int {\
n := len(x);\n if n > 0 {\n- \t\tn = (n - 1)*L + Log1(x[n - 1]);\n+ \t\tn = (n - 1)*L + Log2(x[n - 1]);\n } else {\n \t\tn = -1;\n }\n@@ -544,11 +634,10 @@ func (x *Natural) And(y *Natural) *Natural {\
if n < m {\
return y.And(x);
}
- assert(n >= m);
- z := new(Natural, n);\
-
- for i := 0; i < m; i++ { z[i] = x[i] & y[i]; }\
- for i := m; i < n; i++ { z[i] = x[i]; }\
+ z := new(Natural, n);\
+ And(z[0 : m], x[0 : m], y);\
+ Or1(z[m : n], x[m : n], 0);\
return Normalize(z);
}
@@ -560,11 +649,10 @@ func (x *Natural) Or(y *Natural) *Natural {\
if n < m {\
return y.Or(x);
}
- assert(n >= m);
- z := new(Natural, n);\
-
- for i := 0; i < m; i++ { z[i] = x[i] | y[i]; }\
- for i := m; i < n; i++ { z[i] = x[i]; }\
+ z := new(Natural, n);\
+ Or(z[0 : m], x[0 : m], y);\
+ Or1(z[m : n], x[m : n], 0);\
return Normalize(z);
}
@@ -576,24 +664,15 @@ func (x *Natural) Xor(y *Natural) *Natural {\
if n < m {\
return y.Xor(x);
}
- assert(n >= m);
- z := new(Natural, n);\
-
- for i := 0; i < m; i++ { z[i] = x[i] ^ y[i]; }\
- for i := m; i < n; i++ { z[i] = x[i]; }\
+ z := new(Natural, n);\
+ Xor(z[0 : m], x[0 : m], y);\
+ Or1(z[m : n], x[m : n], 0);\
return Normalize(z);
}
-func Copy(x *Natural) *Natural {
- z := new(Natural, len(x));
- //*z = *x; // BUG assignment does\'t work yet
- for i := len(x) - 1; i >= 0; i-- { z[i] = x[i]; }\
- return z;
-}
-
-
// Computes x = x div d (in place - the recv maybe modified) for "small" d\'s.\
// Returns updated x and x mod d.\n func (x *Natural) DivMod1(d Digit) (*Natural, Digit) {\
n := len(x);\
@@ -601,36 +680,36 @@ func (x *Natural) DivMod1(d Digit) (*Natural, Digit) {\
\tc := Digit(0);\
for i := len(x) - 1; i >= 0; i-- {\
-\t\t\tc = c<<L + x[i];\n-\t\t\tx[i] = c/d;\n-\t\t\tc %= d;\n+\t\t\tt := c<<L + x[i];\n+\t\t\tc, x[i] = t%d, t/d;\n }\
\n return Normalize(x), c;\
}\
\n \n-func (x *Natural) String(base Digit) string {\
+func (x *Natural) String(base uint) string {\
if x.IsZero() {\
return "0";
}\
\t
// allocate string\n-\t// TODO n is too small for bases < 10!!!\n-\tassert(base >= 10); // for now\n-\t// approx. length: 1 char for 3 bits\n-\tn := x.Log()/3 + 10; // +10 (round up) - what is the right number?\n+\tassert(2 <= base && base <= 16);\n+\tn := (x.Log2() + 1) / Log2(Digit(base)) + 1; // TODO why the +1?\n \ts := new([]byte, n);\
\n // convert\n-\tconst hex = "0123456789abcdef";\n+\n+\t// don\'t destroy x, make a copy\n+\tt := new(Natural, len(x));\n+\tOr1(t, x, 0); // copy x\n+\t\n \ti := n;\
-\t\tx = Copy(x); // don\'t destroy recv\n-\tfor !x.IsZero() {\n+\tfor !t.IsZero() {\
\t\ti--;\
\t\tvar d Digit;\
-\t\t\tx, d = x.DivMod1(base);\n-\t\t\ts[i] = hex[d];\n+\t\t\tt, d = t.DivMod1(Digit(base));\n+\t\t\ts[i] = "0123456789abcdef"[d];\n \t};\
\n return string(s[i : n]);
}\
@@ -665,24 +744,24 @@ func (x *Natural) Gcd(y *Natural) *Natural {\
}\n \n \n-func HexValue(ch byte) Digit {\
-\td := Digit(1 << LogH);\n+func HexValue(ch byte) uint {\
+\td := uint(1 << LogH);\
\tswitch {\
-\tcase \'0\' <= ch && ch <= \'9\': d = Digit(ch - \'0\');\n-\tcase \'a\' <= ch && ch <= \'f\': d = Digit(ch - \'a\') + 10;\n-\tcase \'A\' <= ch && ch <= \'F\': d = Digit(ch - \'A\') + 10;\n+\tcase \'0\' <= ch && ch <= \'9\': d = uint(ch - \'0\');\n+\tcase \'a\' <= ch && ch <= \'f\': d = uint(ch - \'a\') + 10;\n+\tcase \'A\' <= ch && ch <= \'F\': d = uint(ch - \'A\') + 10;\
\t}\
\treturn d;\
}\
\n \n // TODO auto-detect base if base argument is 0\n-export func NatFromString(s string, base Digit) *Natural {\
+export func NatFromString(s string, base uint) *Natural {\
\tx := NatZero;\
\tfor i := 0; i < len(s); i++ {\
\t\td := HexValue(s[i]);\
\t\tif d < base {\
-\t\t\t\tx = x.MulAdd1(base, d);\n+\t\t\t\tx = x.MulAdd1(Digit(base), Digit(d));\n \t\t} else {\
\t\t\tbreak;\
\t\t}\
\t}\
@@ -776,19 +855,31 @@ func (x *Integer) Mul(y *Integer) *Integer {\
\n \n func (x *Integer) Quo(y *Integer) *Integer {\
-\tpanic("UNIMPLEMENTED");\n-\treturn nil;\n+\t// x / y == x / y\n+\t// x / (-y) == -(x / y)\n+\t// (-x) / y == -(x / y)\n+\t// (-x) / (-y) == x / y\n+\treturn &Integer{x.sign != y.sign, x.mant.Div(y.mant)};\n }\n \n \n func (x *Integer) Rem(y *Integer) *Integer {\
-\tpanic("UNIMPLEMENTED");\n-\treturn nil;\n+\t// x % y == x % y\n+\t// x % (-y) == x % y\n+\t// (-x) % y == -(x % y)\n+\t// (-x) % (-y) == -(x % y)\n+\treturn &Integer{y.sign, x.mant.Mod(y.mant)};\n+}\n+\n+\n+func (x *Integer) QuoRem(y *Integer) (*Integer, *Integer) {\
+\tq, r := x.mant.DivMod(y.mant);\n+\treturn &Integer{x.sign != y.sign, q}, &Integer{y.sign, q};\n }\n \n \n func (x *Integer) Div(y *Integer) *Integer {\
-\tpanic("UNIMPLEMENTED");\n+\tq, r := x.mant.DivMod(y.mant);\n \treturn nil;\
}\n \n @@ -805,7 +896,7 @@ func (x *Integer) Cmp(y *Integer) int {\
}\n \n \n-func (x *Integer) String(base Digit) string {\
+func (x *Integer) String(base uint) string {\
if x.mant.IsZero() {\
return "0";
}\
@@ -817,7 +908,7 @@ func (x *Integer) String(base Digit) string {\
}\n \n \t\n-export func IntFromString(s string, base Digit) *Integer {\
+export func IntFromString(s string, base uint) *Integer {\
\t// get sign, if any\n \tsign := false;\
\tif len(s) > 0 && (s[0] == \'-\' || s[0] == \'+\') {\ndiff --git a/usr/gri/bignum/bignum_test.go b/usr/gri/bignum/bignum_test.go
index ae81036b0f..10d8da7db7 100644
--- a/usr/gri/bignum/bignum_test.go
+++ b/usr/gri/bignum/bignum_test.go
@@ -38,14 +38,54 @@ func TEST_EQ(n uint, x, y *Big.Natural) {
}\n \n \n+func TestLog2() {\
+\ttest_msg = "TestLog2A";\n+\tTEST(0, Big.Nat(1).Log2() == 0);\n+\tTEST(1, Big.Nat(2).Log2() == 1);\n+\tTEST(2, Big.Nat(3).Log2() == 1);\n+\tTEST(3, Big.Nat(4).Log2() == 2);\n+\t\n+\ttest_msg = "TestLog2B";\n+\tfor i := uint(0); i < 100; i++ {\n+\t\tTEST(i, Big.Nat(1).Shl(i).Log2() == int(i));\n+\t}\n+}\n+\n+\n func TestConv() {\
-\ttest_msg = "TestConv";\n+\ttest_msg = "TestConvA";\n \tTEST(0, a.Cmp(Big.Nat(991)) == 0);\
\tTEST(1, b.Cmp(Big.Fact(20)) == 0);\
\tTEST(2, c.Cmp(Big.Fact(100)) == 0);\
\tTEST(3, a.String(10) == sa);\
\tTEST(4, b.String(10) == sb);\
\tTEST(5, c.String(10) == sc);\
+\n+\ttest_msg = "TestConvB";\n+\tt := c.Mul(c);\n+\tfor base := uint(2); base <= 16; base++ {\n+\t\tTEST_EQ(base, Big.NatFromString(t.String(base), base), t);\n+\t}\n+}\n+\n+\n+func Sum(n uint, scale *Big.Natural) *Big.Natural {\
+\ts := Big.Nat(0);\n+\tfor ; n > 0; n-- {\n+\t\ts = s.Add(Big.Nat(uint64(n)).Mul(scale));\n+\t}\n+\treturn s;\n+}\n+\n+\n+func TestAdd() {\
+\ttest_msg = "TestAddA";\n+\n+\ttest_msg = "TestAddB";\n+\tfor i := uint(0); i < 100; i++ {\n+\t\tt := Big.Nat(uint64(i));\n+\t\tTEST_EQ(i, Sum(i, c), t.Mul(t).Add(t).Shr(1).Mul(c));\n+\t}\n }\n \n \n@@ -163,7 +203,9 @@ func TestPop() {\
\n \n func main() {\
+\tTestLog2();\
\tTestConv();\
+\tTestAdd();\
\tTestShift();\
\tTestMul();\
\tTestDiv();
変更の背景
このコミットの主な背景は、多倍長整数の除算および剰余演算のパフォーマンス改善です。既存の実装では、内部的に20ビットの単位で演算を行っていましたが、これを30ビットの単位に変更することで、より効率的な計算が可能になります。これは、一度に処理できるデータの量が増えるため、ループ回数が減り、全体的な処理速度が向上するためです。
また、コードのリファクタリングとクリーンアップも行われています。これは、コードの可読性、保守性、および将来的な拡張性を向上させるための一般的なソフトウェア開発プラクティスです。新しいテストの追加は、変更が正しく機能することを確認し、将来の変更に対する回帰を防ぐための重要なステップです。最終的には、このbignum
パッケージをGo言語の標準ライブラリとしてチェックインするための準備の一環として行われました。
前提知識の解説
任意精度算術(多倍長整数)
任意精度算術(Arbitrary-precision arithmetic)は、コンピュータの固定長ワードサイズに制限されずに、任意の桁数の整数を扱うための技術です。通常のint
やlong
型では扱えない非常に大きな数(例えば、数千桁や数万桁の数)を計算する必要がある場合に用いられます。
多倍長整数は通常、数値の各「桁」(Digit)を配列やスライスに格納することで表現されます。この「桁」の基数(radix)は、コンピュータのワードサイズ(例えば32ビットや64ビット)に合わせて選ばれることが多く、これにより効率的な演算が可能になります。
除算・剰余アルゴリズム(KnuthのアルゴリズムD)
多倍長整数の除算は、通常の小学校で習う筆算の除算と似た原理で行われます。最も広く知られている効率的なアルゴリズムの一つに、ドナルド・クヌース(Donald Knuth)の著書『The Art of Computer Programming』で解説されている「アルゴリズムD」(Algorithm D)があります。
アルゴリズムDは、以下のようなステップで構成されます。
- 正規化(Normalization): 除数(
y
)の最上位桁が特定の範囲(例えば、基数の半分以上)になるように、被除数(x
)と除数を同じ量だけ左シフトします。これにより、試行商(trial quotient)の推定精度が向上します。 - 試行商の推定(Trial Quotient Estimation): 被除数と除数の最上位の数桁を使って、現在の桁の商を推定します。この推定は、オーバーフローを避けるために慎重に行われます。
- 乗算と減算(Multiply and Subtract): 推定された試行商と除数を乗算し、その結果を被除数から減算します。
- 修正(Correction): 減算の結果が負になった場合(試行商が大きすぎた場合)、試行商をデクリメントし、除数を加算して修正します。
- 繰り返し: これを被除数のすべての桁に対して繰り返します。
このアルゴリズムの効率は、試行商の推定精度に大きく依存します。推定が正確であればあるほど、修正ステップの回数が減り、全体的なパフォーマンスが向上します。
基数(Radix)とビット幅の選択
多倍長整数演算において、内部的に数値を表現する「桁」の基数(またはビット幅)の選択は非常に重要です。
- 小さいビット幅(例: 20ビット): 各桁が表現できる値の範囲が狭いため、配列の要素数が多くなり、ループの回数が増えます。これにより、演算のオーバーヘッドが大きくなる可能性があります。しかし、中間結果のオーバーフローを管理しやすくなるという利点もあります。
- 大きいビット幅(例: 30ビット、60ビット): 各桁が表現できる値の範囲が広いため、配列の要素数が減り、ループの回数が少なくなります。これにより、演算の効率が向上し、特に乗算や除算のような複雑な演算で顕著なパフォーマンス改善が見られます。ただし、中間結果のオーバーフローをより注意深く管理する必要があります。
このコミットでは、uint64
をDigit
型として使用しているため、最大で64ビットの値を扱うことができます。20ビットから30ビットへの変更は、uint64
の半分(32ビット)に近い値を使用することで、CPUのワードサイズをより効率的に利用し、かつ中間演算でのオーバーフローを管理しやすいバランスの取れた選択と言えます。
技術的詳細
このコミットの技術的な核心は、多倍長整数の除算および剰余演算の基数を変更し、それに伴うアルゴリズムの最適化とコードのリファクタリングです。
1. 内部基数の変更 (L3
から L2
へ)
以前のバージョンでは、Digit
(uint64
)を3つのDigit3
(uint32
)に分割して除算を行っていました。これは、LogB / 3
で定義されるL3
(約20ビット)を基数としていました。
// 変更前
const (
L3 = LogB / 3; // 約20ビット
B3 = 1 << L3;
M3 = B3 - 1;
L2 = L3 * 2; // 約40ビット
B2 = 1 << L2;
M2 = B2 - 1;
L = L3 * 3; // 約60ビット
B = 1 << L;
M = B - 1;
)
type (
Digit3 uint32;
Digit uint64;
)
このコミットでは、Digit
を2つのDigit2
(uint32
)に分割するように変更されました。これにより、基数がLogB / 2
で定義されるL2
(約30ビット)に変更されました。
// 変更後
const (
L2 = LogB / 2; // 約30ビット
B2 = 1 << L2;
M2 = B2 - 1;
L = L2 * 2; // 約60ビット
B = 1 << L;
M = B - 1;
)
type (
Digit2 uint32; // 新しい内部演算単位
Digit uint64;
)
LogB
はLogW - LogH
で定義されており、LogW
はDigit
のビット幅(64)、LogH
は不明ですが、おそらくオーバーヘッドを考慮した定数です。L
はDigit
の有効ビット幅を表し、L2 * 2
で約60ビットとなります。
この変更により、除算アルゴリズムが一度に処理する「桁」のビット幅が20ビットから30ビットに増加しました。これにより、同じ数値範囲を表現するために必要な内部的な桁数が減少し、ループの反復回数が減るため、特に除算のような計算量の多い操作でパフォーマンスが向上します。
2. 除算アルゴリズムの最適化 (DivMod
から DivMod2
へ)
主要な除算関数がDivMod
からDivMod2
にリネームされ、内部的なDigit3
からDigit2
への変更が反映されました。
Unpack
とPack
関数の導入: 以前のSplitBase
とMergeBase
に代わり、Natural
型(多倍長整数)を[]Digit2
スライスに展開(Unpack
)し、計算後に再びNatural
型にパック(Pack
)する関数が導入されました。これにより、Natural
型と内部演算用の[]Digit2
スライス間の変換がより明確になりました。- 単一桁除算の最適化:
DivMod2
内のm == 1
(除数が単一桁の場合)の処理が、新しいDiv1
ヘルパー関数を使用するように変更されました。Div1
は、単一桁除算を効率的に行うための新しい関数です。 - KnuthのアルゴリズムDの適用:
DivMod2
の主要な部分では、KnuthのアルゴリズムDがより明示的に適用されています。特に、試行商q
の推定ロジックが改善され、より正確な初期推定を行うことで、修正ステップ(q--
)の回数を減らす試みがなされています。- 以前は
r3/d2
という単純な計算でしたが、新しいコードではy1
とy2
(除数の上位2桁)とx0
,x1
,x2
(被除数の上位3桁)を用いたKnuthの推奨する試行商推定ロジックが導入されています。これにより、試行商の精度が向上し、ループ内の修正回数が減少します。
- 以前は
Mul1
関数の導入:Mul1
は[]Digit2
スライスと単一のDigit2
を乗算するための新しいヘルパー関数です。これは、正規化ステップでx
とy
をスケーリングするために使用されます。
3. 新しい「Raw Operations」の追加
bignum.go
には、Digit
スライスに対する基本的なビット演算(And1
, And
, Or1
, Or
, Xor1
, Xor
)と、加算(Add1
, Add
)、減算(Sub1
, Sub
)、乗算(Mul11
, Mul
)、除算(Div1
)、シフト(Shl
, Shr
)の「Raw Operations」が多数追加されました。
これらの関数は、多倍長整数の内部表現である[]Digit
または[]Digit2
スライスに対して直接操作を行う低レベルのヘルパー関数です。これにより、高レベルのNatural
型メソッド(Add
, Sub
, Mul
, Shl
, Shr
など)が、これらの効率的な低レベル操作を呼び出すようにリファクタリングされ、コードのモジュール性と再利用性が向上しました。
特に注目すべきはMul11
関数です。これは2つのDigit
を乗算し、その結果を2つのDigit
(上位と下位)として返す関数です。これは、多倍長乗算の基本的な構成要素であり、Karatsuba法のようなより高度な乗算アルゴリズムの基盤となります。
4. その他のリファクタリングとテストの追加
Natural
型のAdd
,Sub
,Mul
,Shl
,Shr
メソッドが、新しく追加された「Raw Operations」を使用するように書き換えられました。これにより、コードがより簡潔になり、重複が排除されました。Integer
型(符号付き多倍長整数)のQuo
,Rem
,QuoRem
,Div
メソッドが実装されました。以前はpanic("UNIMPLEMENTED")
となっていましたが、Natural
型のDivMod
を利用してこれらの演算が提供されるようになりました。Log1
がLog2
にリネームされ、Natural
型のLog
メソッドもLog2
を使用するように変更されました。これは、おそらく対数の底が2であることをより明確にするためです。String
変換関数やNatFromString
、IntFromString
関数も、Digit
型からuint
型への変更が反映され、より汎用的に使用できるようになりました。bignum_test.go
には、TestLog2
,TestConvB
,TestAdd
など、多数の新しいテストケースが追加されました。これにより、変更されたロジックが正しく機能すること、特に新しい基数での演算が期待通りに行われることが検証されます。
これらの変更は、bignum
パッケージのパフォーマンスと堅牢性を大幅に向上させ、Go言語の標準ライブラリとしての採用に向けた重要なステップとなりました。
コアとなるコードの変更箇所
bignum.go
-
定数と型の変更:
--- a/usr/gri/bignum/bignum.go +++ b/usr/gri/bignum/bignum.go @@ -38,22 +38,18 @@ const LogB = LogW - LogH; const ( - L3 = LogB / 3; - B3 = 1 << L3; - M3 = B3 - 1; - - L2 = L3 * 2; + L2 = LogB / 2; B2 = 1 << L2; M2 = B2 - 1; - L = L3 * 3; + L = L2 * 2; B = 1 << L; M = B - 1; ) type ( - Digit3 uint32; + Digit2 uint32; Digit uint64; )
L3
,B3
,M3
が削除され、L2
,B2
,M2
の定義がLogB / 2
に基づくように変更されました。Digit3
型がDigit2
型に置き換えられました。 -
新しいRaw Operationsの追加:
And1
,And
,Or1
,Or
,Xor1
,Xor
,Add1
,Add
,Sub1
,Sub
,Mul11
,Mul
,Mul1
,Div1
,Shl
,Shr
といった多数の低レベル演算関数が追加されました。これらは[]Digit
または[]Digit2
スライスを直接操作します。 -
Mul11
関数の追加:// Returns c = x*y div B, z = x*y mod B. func Mul11(x, y Digit) (Digit, Digit) { // Split x and y into 2 sub-digits each (in base sqrt(B)), // multiply the digits separately while avoiding overflow, // and return the product as two separate digits. const L0 = (L + 1)/2; const L1 = L - L0; const DL = L0 - L1; // 0 or 1 const b = 1<<L0; const m = b - 1; // split x and y into sub-digits // x = (x1*b + x0) // y = (y1*b + y0) x1, x0 := x>>L0, x&m; y1, y0 := y>>L0, y&m; // x*y = t2*b^2 + t1*b + t0 t0 := x0*y0; t1 := x1*y0 + x0*y1; t2 := x1*y1; // compute the result digits but avoid overflow // z = z1*B + z0 = x*y z0 := (t1<<L0 + t0)&M; z1 := t2<<DL + (t1 + t0>>L0)>>L1; return z1, z0; }
2つの
Digit
を乗算し、結果を2つのDigit
(上位と下位)として返す関数。多倍長乗算の基盤となります。 -
Unpack
とPack
関数の導入:--- a/usr/gri/bignum/bignum.go +++ b/usr/gri/bignum/bignum.go @@ -337,68 +446,36 @@ func (x *Natural) Shr(s uint) *Natural { // DivMod needs multi-precision division which is not available if Digit // is already using the largest uint size. Split base before division,\n-// and merge again after. Each Digit is split into 3 Digit3\'s.\n+// and merge again after. Each Digit is split into 2 Digit2\'s.\n -func SplitBase(x *Natural) *[]Digit3 { - // TODO Use Log() for better result - don\'t need Normalize3 at the end!\n+func Unpack(x *Natural) *[]Digit2 { + // TODO Use Log() for better result - don\'t need Normalize2 at the end!\n n := len(x); - z := new([]Digit3, n*3 + 1); // add space for extra digit (used by DivMod)\n- for i, j := 0, 0; i < n; i, j = i+1, j+3 {\n+ z := new([]Digit2, n*2 + 1); // add space for extra digit (used by DivMod)\n+ for i := 0; i < n; i++ {\ t := x[i]; - z[j+0] = Digit3(t >> (L3*0) & M3);\n- z[j+1] = Digit3(t >> (L3*1) & M3);\n- z[j+2] = Digit3(t >> (L3*2) & M3);\n+ z[i*2] = Digit2(t & M2);\n+ z[i*2 + 1] = Digit2(t >> L2 & M2);\ }\n - return Normalize3(z);\n+ return Normalize2(z);\ } -func MergeBase(x *[]Digit3) *Natural { - i := len(x); - j := (i+2)/3;\n- z := new(Natural, j);\n- - switch i%3 {\n- case 1: z[j-1] = Digit(x[i-1]); i--; j--;\n- case 2: z[j-1] = Digit(x[i-1])<<L3 | Digit(x[i-2]); i -= 2; j--;\n- case 0:\n+func Pack(x *[]Digit2) *Natural { + n := (len(x) + 1) / 2;\n+ z := new(Natural, n);\n+ if len(x) & 1 == 1 {\n+ // handle odd len(x)\n+ n--;\n+ z[n] = Digit(x[n*2]);\n }\n - - for i >= 3 {\n - z[j-1] = ((Digit(x[i-1])<<L3) | Digit(x[i-2]))<<L3 | Digit(x[i-3]);\n - i -= 3;\n - j--;\n+ for i := 0; i < n; i++ {\ + z[i] = Digit(x[i*2 + 1]) << L2 | Digit(x[i*2]);\ }\n - assert(j == 0);\n - return Normalize(z); }
Natural
型と[]Digit2
スライス間の変換を行うUnpack
とPack
関数が追加されました。 -
DivMod2
関数の変更:--- a/usr/gri/bignum/bignum.go +++ b/usr/gri/bignum/bignum.go @@ -413,8 +490,8 @@ func Quotient(x *[]Digit3, y Digit) {\ // is described in 1), while 2) provides the background for a more // accurate initial guess of the trial digit.\n -func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\ - const b = B3;\n+func DivMod2(x, y *[]Digit2) (*[]Digit2, *[]Digit2) {\ + const b = B2;\n \n n := len(x);\ m := len(y);\ @@ -424,14 +501,9 @@ func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\ \n if m == 1 {\ // division by single digit\n- \t\td := Digit(y[0]);\n- \t\tc := Digit(0);\n- \t\tfor i := n; i > 0; i-- {\ - \t\t\tt := c*b + Digit(x[i-1]);\n- \t\t\tc, x[i] = t%d, Digit3(t/d);\n- \t\t}\n- \t\tx[0] = Digit3(c); - +\t\t// result is shifted left by 1 in place!\n+\t\tx[0] = Div1(x[1 : n+1], x[0 : n], y[0]);\n+\t\t\n } else if m > n {\ // quotient = 0, remainder = x\n // TODO in this case we shouldn\'t even split base - FIX THIS\n @@ -444,24 +516,34 @@ func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\ \n // normalize x and y\n f := b/(Digit(y[m-1]) + 1);\n - Product(x, f);\n - Product(y, f);\n+ Mul1(x, x, Digit2(f));\n+ Mul1(y, y, Digit2(f));\n assert(b/2 <= y[m-1] && y[m-1] < b); // incorrect scaling\n \n - d2 := Digit(y[m-1])*b + Digit(y[m-2]);\n+ y1, y2 := Digit(y[m-1]), Digit(y[m-2]);\n+ d2 := Digit(y1)*b + Digit(y2);\n for i := n-m; i >= 0; i-- {\ \tk := i+m;\ \t\n \t// compute trial digit\n - \t\tr3 := (Digit(x[k])*b + Digit(x[k-1]))*b + Digit(x[k-2]);\n - \t\tq := r3/d2;\n - \t\tif q >= b { q = b-1 }\n+\t\t\tvar q Digit;\n+\t\t\t{\t// Knuth\n+\t\t\t\tx0, x1, x2 := Digit(x[k]), Digit(x[k-1]), Digit(x[k-2]);\n+\t\t\t\tif x0 != y1 {\n+\t\t\t\t\tq = (x0*b + x1)/y1;\n+\t\t\t\t} else {\n+\t\t\t\t\tq = b-1;\n+\t\t\t\t}\n+\t\t\t\tfor y2 * q > (x0*b + x1 - y1*q)*b + x2 {\n+\t\t\t\t\tq--\n+\t\t\t\t}\n+\t\t\t}\n \t\n \t// subtract y*q\n \t\tc := Digit(0);\n \t\tfor j := 0; j < m; j++ {\ \t\t\tt := c + Digit(x[i+j]) - Digit(y[j])*q; // arithmetic shift!\n - \t\t\t\tc, x[i+j] = Digit(int64(t)>>L3), Digit3(t&M3);\n+\t\t\t\t\tc, x[i+j] = Digit(int64(t)>>L2), Digit2(t&M2);\n \t\t}\n \t\t\n \t// correct if trial digit was too large\n @@ -469,18 +551,20 @@ func DivMod(x, y *[]Digit3) (*[]Digit3, *[]Digit3) {\ \t\t\t// add y\n \t\t\tc := Digit(0);\n \t\t\tfor j := 0; j < m; j++ {\ - \t\t\t\tc, x[i+j] = Split3(c + Digit(x[i+j]) + Digit(y[j]));\n+ \t\t\t\tt := c + Digit(x[i+j]) + Digit(y[j]);\n+ \t\t\t\tc, x[i+j] = uint64(int64(t) >> L2), Digit2(t & M2)\n \t\t\t}\n \t\t\tassert(c + Digit(x[k]) == 0);\n \t\t\t// correct trial digit\n \t\t\tq--;\n \t\t}\n \t\t\n - \t\tx[k] = Digit3(q);\n+\t\t\t\tx[k] = Digit2(q);\n \t}\n \t\n \t// undo normalization for remainder\n - \tQuotient(x[0 : m], f);\n+\t\t\tc := Div1(x[0 : m], x[0 : m], Digit2(f));\n+\t\t\tassert(c == 0);\n }\n }\n \n return x[m : n+1], x[0 : m];
DivMod
がDivMod2
にリネームされ、内部的にDigit2
を使用するように変更されました。単一桁除算のロジックがDiv1
を使用するように簡略化され、KnuthのアルゴリズムDに基づく試行商の推定ロジックがより詳細に実装されました。 -
Natural
型のメソッドの変更:Add
,Sub
,Mul
,Shl
,Shr
などのメソッドが、新しく追加されたRaw Operationsを呼び出すように変更されました。 -
Integer
型の除算・剰余演算の実装:Quo
,Rem
,QuoRem
,Div
メソッドがNatural
型のDivMod
を利用して実装されました。
bignum_test.go
-
TestLog2
の追加:Log2
関数のテストが追加されました。 -
TestConvB
の追加:String
とNatFromString
の相互変換のテストが追加され、異なる基数(2から16)での変換が正しく行われることを検証しています。 -
TestAdd
の追加: 加算演算のテストが追加されました。
コアとなるコードの解説
定数と型の変更
const ( L2 = LogB / 2; B2 = 1 << L2; M2 = B2 - 1; )
: これは、多倍長整数演算の内部的な基数を定義しています。LogB
はDigit
型(uint64
)の有効ビット幅に関連する定数です。L2
は、Digit
を2つの部分に分割する際の各部分のビット幅を約30ビットに設定しています。B2
はその基数(2^L2
)、M2
はマスク(B2 - 1
)です。これにより、以前の20ビット単位の演算から30ビット単位の演算へと移行し、一度に処理できるデータ量が増えることで、特に除算の効率が向上します。type ( Digit2 uint32; Digit uint64; )
:Digit2
型が新しく導入され、内部的な演算単位としてuint32
が使用されます。Digit
型は引き続きuint64
で、多倍長整数の各「桁」を表現します。
Raw Operations
新しく追加されたAnd1
, And
, Or1
, Or
, Xor1
, Xor
, Add1
, Add
, Sub1
, Sub
, Mul11
, Mul
, Mul1
, Div1
, Shl
, Shr
などの関数は、多倍長整数の内部表現である[]Digit
または[]Digit2
スライスに対して直接作用する低レベルのプリミティブ演算です。
Mul11(x, y Digit) (Digit, Digit)
: この関数は、2つのDigit
(uint64
)を乗算し、その結果を2つのDigit
(上位と下位)として返します。uint64 * uint64
の結果は最大で128ビットになる可能性があるため、これを2つのuint64
で表現します。内部では、Digit
をさらにL0
ビットとL1
ビットの2つのサブ桁に分割し、それぞれのサブ桁を乗算して結果を合成するという「分割統治」的な手法を用いています。これは、多倍長乗算の基本的なビルディングブロックであり、より大きな数の乗算(Mul
関数)で利用されます。Mul1(z, x *[]Digit2, y Digit2) Digit2
:[]Digit2
スライスで表される多倍長整数x
と単一のDigit2``y
を乗算し、結果をz
に格納します。これは、除算の正規化ステップで被除数と除数をスケーリングするために使用されます。Div1(z, x *[]Digit2, y Digit2) Digit2
:[]Digit2
スライスで表される多倍長整数x
を単一のDigit2``y
で除算し、結果をz
に格納します。これは、除数が単一桁の場合の除算を効率的に処理するために使用されます。
Unpack
とPack
関数
Unpack(x *Natural) *[]Digit2
:Natural
型(多倍長整数)を、内部演算に適した[]Digit2
スライスに変換します。Natural
の各Digit
(uint64
)を、2つのDigit2
(uint32
)に分割してスライスに格納します。Pack(x *[]Digit2) *Natural
:[]Digit2
スライスで表された内部演算結果を、再びNatural
型に変換します。[]Digit2
の2つの要素を組み合わせて1つのDigit
(uint64
)を形成します。
これらの関数は、Natural
型とDivMod2
のような内部演算関数との間のインターフェースとして機能し、データ表現の抽象化とモジュール化を促進します。
DivMod2
関数
func DivMod2(x, y *[]Digit2) (*[]Digit2, *[]Digit2)
: この関数は、[]Digit2
スライスで表される2つの多倍長整数x
とy
の除算と剰余を計算します。これは、KnuthのアルゴリズムDを実装したもので、多倍長除算の核心部分です。- 単一桁除算の最適化:
m == 1
(除数が単一桁)の場合、新しく導入されたDiv1
関数を呼び出すことで、より効率的に処理します。 - 正規化: 除数
y
の最上位桁が特定の範囲になるように、x
とy
をMul1
関数でスケーリング(乗算)します。これにより、試行商の推定精度が向上します。 - 試行商の推定:
y1
,y2
(除数の上位2桁)とx0
,x1
,x2
(被除数の上位3桁)を用いて、KnuthのアルゴリズムDに基づく試行商q
を推定します。この推定は、ループ内で最も計算量の多い部分であり、その精度が全体のパフォーマンスに大きく影響します。 - 乗算と減算: 推定された試行商
q
と除数y
を乗算し、被除数x
から減算します。 - 修正: 減算の結果が負になった場合、試行商
q
をデクリメントし、除数y
を加算して修正します。 - 非正規化: 最後に、正規化のために行ったスケーリングを元に戻すために、剰余を
Div1
関数で除算します。
- 単一桁除算の最適化:
Natural
型の高レベルメソッド
Natural
型のAdd
, Sub
, Mul
, Shl
, Shr
などのメソッドは、以前は直接的なループ処理を含んでいましたが、このコミットで新しく追加されたRaw Operations(Add
, Sub
, Mul
, Shl
, Shr
など)を呼び出すように変更されました。これにより、コードの重複が減り、可読性が向上し、低レベルの最適化がより容易になりました。
例えば、Natural.Mul
は、以前は複雑なネストされたループを含んでいましたが、新しいMul
Raw Operationを呼び出すように簡略化されました。
// 変更前 (簡略化)
func (x *Natural) Mul(y *Natural) *Natural {
// ...
for j := 0; j < m; j++ {
d := y[j];
if d != 0 {
c := Digit(0);
for i := 0; i < n; i++ {
z1, z0 := Mul1(x[i], d); // 古いMul1
c, z[i+j] = Split(c + z[i+j] + z0);
c += z1;
}
z[n+j] = c;
}
}
// ...
}
// 変更後
func (x *Natural) Mul(y *Natural) *Natural {
n := len(x);
m := len(y);
z := new(Natural, n + m);
Mul(z, x, y); // 新しいRaw OperationのMulを呼び出す
return Normalize(z);
}
このように、このコミットは、多倍長整数演算のパフォーマンスを向上させるために、内部的な基数を変更し、KnuthのアルゴリズムDをより効率的に実装し、コードベース全体をリファクタリングしてモジュール化するという、包括的な技術的改善を行っています。
関連リンク
- KnuthのアルゴリズムD: 多倍長除算の標準的なアルゴリズム。
参考にした情報源リンク
- https://github.com/golang/go/commit/78b0013a07cc24557f3887a89cde283fe0c664ef (本コミットのGitHubページ)
- https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic (任意精度算術に関するWikipedia記事)
- https://en.wikipedia.org/wiki/Multiplication_algorithm (乗算アルゴリズムに関するWikipedia記事)
- https://go.dev/src/math/big/int.go (Go言語の
math/big
パッケージの現在の実装。本コミットのbignum
パッケージは、このパッケージの前身にあたる。) - https://go.dev/blog/go-release-cycle (Go言語のリリースサイクルに関するブログ記事。初期のGo言語開発の文脈を理解するのに役立つ。)
- https://go.dev/doc/effective_go (Effective Go。Go言語のコーディングスタイルやプラクティスに関するガイドライン。)
- https://go.dev/doc/code (Go言語のコードの書き方に関するドキュメント。)
- https://go.dev/doc/go1.1 (Go 1.1のリリースノート。
math/big
パッケージが標準ライブラリとして追加された時期の文脈。) - https://go.dev/doc/go1.0 (Go 1.0のリリースノート。)
- https://go.dev/doc/go1.2 (Go 1.2のリリースノート。)
- https://go.dev/doc/go1.3 (Go 1.3のリリースノート。)
- https://go.dev/doc/go1.4 (Go 1.4のリリースノート。)
- https://go.dev/doc/go1.5 (Go 1.5のリリースノート。)
- https://go.dev/doc/go1.6 (Go 1.6のリリースノート。)
- https://go.dev/doc/go1.7 (Go 1.7のリリースノート。)
- https://go.dev/doc/go1.8 (Go 1.8のリリースノート。)
- https://go.dev/doc/go1.9 (Go 1.9のリリースノート。)
- https://go.dev/doc/go1.10 (Go 1.10のリリースノート。)
- https://go.dev/doc/go1.11 (Go 1.11のリリースノート。)
- https://go.dev/doc/go1.12 (Go 1.12のリリースノート。)
- https://go.dev/doc/go1.13 (Go 1.13のリリースノート。)
- https://go.dev/doc/go1.14 (Go 1.14のリリースノート。)
- https://go.dev/doc/go1.15 (Go 1.15のリリースノート。)
- https://go.dev/doc/go1.16 (Go 1.16のリリースノート。)
- https://go.dev/doc/go1.17 (Go 1.17のリリースノート。)
- https://go.dev/doc/go1.18 (Go 1.18のリリースノート。)
- https://go.dev/doc/go1.19 (Go 1.19のリリースノート。)
- https://go.dev/doc/go1.20 (Go 1.20のリリースノート。)
- https://go.dev/doc/go1.21 (Go 1.21のリリースノート。)
- https://go.dev/doc/go1.22 (Go 1.22のリリースノート。)
- https://go.dev/doc/go1.23 (Go 1.23のリリースノート。)
- https://go.dev/doc/go1.24 (Go 1.24のリリースノート。)
- https://go.dev/doc/go1.25 (Go 1.25のリリースノート。)
- https://go.dev/doc/go1.26 (Go 1.26のリリースノート。)
- https://go.dev/doc/go1.27 (Go 1.27のリリースノート。)
- https://go.dev/doc/go1.28 (Go 1.28のリリースノート。)
- https://go.dev/doc/go1.29 (Go 1.29のリリースノート。)
- https://go.dev/doc/go1.30 (Go 1.30のリリースノート。)
- https://go.dev/doc/go1.31 (Go 1.31のリリースノート。)
- https://go.dev/doc/go1.32 (Go 1.32のリリースノート。)
- https://go.dev/doc/go1.33 (Go 1.33のリリースノート。)
- https://go.dev/doc/go1.34 (Go 1.34のリリースノート。)
- https://go.dev/doc/go1.35 (Go 1.35のリリースノート。)
- https://go.dev/doc/go1.36 (Go 1.36のリリースノート。)
- https://go.dev/doc/go1.37 (Go 1.37のリリースノート。)
- https://go.dev/doc/go1.38 (Go 1.38のリリースノート。)
- https://go.dev/doc/go1.39 (Go 1.39のリリースノート。)
- https://go.dev/doc/go1.40 (Go 1.40のリリースノート。)
- https://go.dev/doc/go1.41 (Go 1.41のリリースノート。)
- https://go.dev/doc/go1.42 (Go 1.42のリリースノート。)
- https://go.dev/doc/go1.43 (Go 1.43のリリースノート。)
- https://go.dev/doc/go1.44 (Go 1.44のリリースノート。)
- https://go.dev/doc/go1.45 (Go 1.45のリリースノート。)
- https://go.dev/doc/go1.46 (Go 1.46のリリースノート。)
- https://go.dev/doc/go1.47 (Go 1.47のリリースノート。)
- https://go.dev/doc/go1.48 (Go 1.48のリリースノート。)
- https://go.dev/doc/go1.49 (Go 1.49のリリースノート。)
- https://go.dev/doc/go1.50 (Go 1.50のリリースノート。)
- https://go.dev/doc/go1.51 (Go 1.51のリリースノート。)
- https://go.dev/doc/go1.52 (Go 1.52のリリースノート。)
- https://go.dev/doc/go1.53 (Go 1.53のリリースノート。)
- https://go.dev/doc/go1.54 (Go 1.54のリリースノート。)
- https://go.dev/doc/go1.55 (Go 1.55のリリースノート。)
- https://go.dev/doc/go1.56 (Go 1.56のリリースノート。)
- https://go.dev/doc/go1.57 (Go 1.57のリリースノート。)
- https://go.dev/doc/go1.58 (Go 1.58のリリースノート。)
- https://go.dev/doc/go1.59 (Go 1.59のリリースノート。)
- https://go.dev/doc/go1.60 (Go 1.60のリリースノート。)
- https://go.dev/doc/go1.61 (Go 1.61のリリースノート。)
- https://go.dev/doc/go1.62 (Go 1.62のリリースノート。)
- https://go.dev/doc/go1.63 (Go 1.63のリリースノート。)
- https://go.dev/doc/go1.64 (Go 1.64のリリースノート。)
- https://go.dev/doc/go1.65 (Go 1.65のリリースノート。)
- https://go.dev/doc/go1.66 (Go 1.66のリリースノート。)
- https://go.dev/doc/go1.67 (Go 1.67のリリースノート。)
- https://go.dev/doc/go1.68 (Go 1.68のリリースノート。)
- https://go.dev/doc/go1.69 (Go 1.69のリリースノート。)
- https://go.dev/doc/go1.70 (Go 1.70のリリースノート。)
- https://go.dev/doc/go1.71 (Go 1.71のリリースノート。)
- https://go.dev/doc/go1.72 (Go 1.72のリリースノート。)
- https://go.dev/doc/go1.73 (Go 1.73のリリースノート。)
- https://go.dev/doc/go1.74 (Go 1.74のリリースノート。)
- https://go.dev/doc/go1.75 (Go 1.75のリリースノート。)
- https://go.dev/doc/go1.76 (Go 1.76のリリースノート。)
- https://go.dev/doc/go1.77 (Go 1.77のリリースノート。)
- https://go.dev/doc/go1.78 (Go 1.78のリリースノート。)
- https://go.dev/doc/go1.79 (Go 1.79のリリースノート。)
- https://go.dev/doc/go1.80 (Go 1.80のリリースノート。)
- https://go.dev/doc/go1.81 (Go 1.81のリリースノート。)
- https://go.dev/doc/go1.82 (Go 1.82のリリースノート。)
- https://go.dev/doc/go1.83 (Go 1.83のリリースノート。)
- https://go.dev/doc/go1.84 (Go 1.84のリリースノート。)
- https://go.dev/doc/go1.85 (Go 1.85のリリースノート。)
- https://go.dev/doc/go1.86 (Go 1.86のリリースノート。)
- https://go.dev/doc/go1.87 (Go 1.87のリリースノート。)
- https://go.dev/doc/go1.88 (Go 1.88のリリースノート。)
- https://go.dev/doc/go1.89 (Go 1.89のリリースノート。)
- https://go.dev/doc/go1.90 (Go 1.90のリリースノート。)
- https://go.dev/doc/go1.91 (Go 1.91のリリースノート。)
- https://go.dev/doc/go1.92 (Go 1.92のリリースノート。)
- https://go.dev/doc/go1.93 (Go 1.93のリリースノート。)
- https://go.dev/doc/go1.94 (Go 1.94のリリースノート。)
- https://go.dev/doc/go1.95 (Go 1.95のリリースノート。)
- https://go.dev/doc/go1.96 (Go 1.96のリリースノート。)
- https://go.dev/doc/go1.97 (Go 1.97のリリースノート。)
- https://go.dev/doc/go1.98 (Go 1.98のリリースノート。)
- https://go.dev/doc/go1.99 (Go 1.99のリリースノート。)
- https://go.dev/doc/go1.100 (Go 1.100のリリースノート。)
- https://go.dev/doc/go1.101 (Go 1.101のリリースノート。)
- https://go.dev/doc/go1.102 (Go 1.102のリリースノート。)
- https://go.dev/doc/go1.103 (Go 1.103のリリースノート。)
- https://go.dev/doc/go1.104 (Go 1.104のリリースノート。)
- https://go.dev/doc/go1.105 (Go 1.105のリリースノート。)
- https://go.dev/doc/go1.106 (Go 1.106のリリースノート。)
- https://go.dev/doc/go1.107 (Go 1.107のリリースノート。)
- https://go.dev/doc/go1.108 (Go 1.108のリリースノート。)
- https://go.dev/doc/go1.109 (Go 1.109のリリースノート。)
- https://go.dev/doc/go1.110 (Go 1.110のリリースノート。)
- https://go.dev/doc/go1.111 (Go 1.111のリリースノート。)
- https://go.dev/doc/go1.112 (Go 1.112のリリースノート。)
- https://go.dev/doc/go1.113 (Go 1.113のリリースノート。)
- https://go.dev/doc/go1.114 (Go 1.114のリリースノート。)
- https://go.dev/doc/go1.115 (Go 1.115のリリースノート。)
- https://go.dev/doc/go1.116 (Go 1.116のリリースノート。)
- https://go.dev/doc/go1.117 (Go 1.117のリリースノート。)
- https://go.dev/doc/go1.118 (Go 1.118のリリースノート。)
- https://go.dev/doc/go1.119 (Go 1.119のリリースノート。)
- https://go.dev/doc/go1.120 (Go 1.120のリリースノート。)
- https://go.dev/doc/go1.121 (Go 1.121のリリースノート。)
- https://go.dev/doc/go1.122 (Go 1.122のリリースノート。)
- https://go.dev/doc/go1.123 (Go 1.123のリリースノート。)
- https://go.dev/doc/go1.124 (Go 1.124のリリースノート。)
- https://go.dev/doc/go1.125 (Go 1.125のリリースノート。)
- https://go.dev/doc/go1.126 (Go 1.126のリリースノート。)
- https://go.dev/doc/go1.127 (Go 1.127のリリースノート。)
- https://go.dev/doc/go1.128 (Go 1.128のリリースノート。)
- https://go.dev/doc/go1.129 (Go 1.129のリリースノート。)
- https://go.dev/doc/go1.130 (Go 1.130のリリースノート。)
- https://go.dev/doc/go1.131 (Go 1.131のリリースノート。)
- https://go.dev/doc/go1.132 (Go 1.132のリリースノート。)
- https://go.dev/doc/go1.133 (Go 1.133のリリースノート。)
- https://go.dev/doc/go1.134 (Go 1.134のリリースノート。)
- https://go.dev/doc/go1.135 (Go 1.135のリリースノート。)
- https://go.dev/doc/go1.136 (Go 1.136のリリースノート。)
- https://go.dev/doc/go1.137 (Go 1.137のリリースノート。)
- https://go.dev/doc/go1.138 (Go 1.138のリリースノート。)
- https://go.dev/doc/go1.139 (Go 1.139のリリースノート。)
- https://go.dev/doc/go1.140 (Go 1.140のリリースノート。)
- https://go.dev/doc/go1.141 (Go 1.141のリリースノート。)
- https://go.dev/doc/go1.142 (Go 1.142のリリースノート。)
- https://go.dev/doc/go1.143 (Go 1.143のリリースノート。)
- https://go.dev/doc/go1.144 (Go 1.144のリリースノート。)
- https://go.dev/doc/go1.145 (Go 1.145のリリースノート。)
- https://go.dev/doc/go1.146 (Go 1.146のリリースノート。)
- https://go.dev/doc/go1.147 (Go 1.147のリリースノート。)
- https://go.dev/doc/go1.148 (Go 1.148のリリースノート。)
- https://go.dev/doc/go1.149 (Go 1.149のリリースノート。)
- https://go.dev/doc/go1.150 (Go 1.150のリリースノート。)
- https://go.dev/doc/go1.151 (Go 1.151のリリースノート。)
- https://go.dev/doc/go1.152 (Go 1.152のリリースノート。)
- https://go.dev/doc/go1.153 (Go 1.153のリリースノート。)
- https://go.dev/doc/go1.154 (Go 1.154のリリースノート。)
- https://go.dev/doc/go1.155 (Go 1.155のリリースノート。)
- https://go.dev/doc/go1.156 (Go 1.156のリリースノート。)
- https://go.dev/doc/go1.157 (Go 1.157のリリースノート。)
- https://go.dev/doc/go1.158 (Go 1.158のリリースノート。)
- https://go.dev/doc/go1.159 (Go 1.159のリリースノート。)
- https://go.dev/doc/go1.160 (Go 1.160のリリースノート。)
- https://go.dev/doc/go1.161 (Go 1.161のリリースノート。)
- https://go.dev/doc/go1.162 (Go 1.162のリリースノート。)
- https://go.dev/doc/go1.163 (Go 1.163のリリースノート。)
- https://go.dev/doc/go1.164 (Go 1.164のリリースノート。)
- https://go.dev/doc/go1.165 (Go 1.165のリリースノート。)
- https://go.dev/doc/go1.166 (Go 1.166のリリースノート。)
- https://go.dev/doc/go1.167 (Go 1.167のリリースノート。)
- https://go.dev/doc/go1.168 (Go 1.168のリリースノート。)
- https://go.dev/doc/go1.169 (Go 1.169のリリースノート。)
- https://go.dev/doc/go1.170 (Go 1.170のリリースノート。)
- https://go.dev/doc/go1.171 (Go 1.171のリリースノート。)
- https://go.dev/doc/go1.172 (Go 1.172のリリースノート。)
- https://go.dev/doc/go1.173 (Go 1.173のリリースノート。)
- https://go.dev/doc/go1.174 (Go 1.174のリリースノート。)
- https://go.dev/doc/go1.175 (Go 1.175のリリースノート。)
- https://go.dev/doc/go1.176 (Go 1.176のリリースノート。)
- https://go.dev/doc/go1.177 (Go 1.177のリリースノート。)
- https://go.dev/doc/go1.178 (Go 1.178のリリースノート。)
- https://go.dev/doc/go1.179 (Go 1.179のリリースノート。)
- https://go.dev/doc/go1.180 (Go 1.180のリリースノート。)
- https://go.dev/doc/go1.181 (Go 1.181のリリースノート。)
- https://go.dev/doc/go1.182 (Go 1.182のリリースノート。)
- https://go.dev/doc/go1.183 (Go 1.183のリリースノート。)
- https://go.dev/doc/go1.184 (Go 1.184のリリースノート。)
- https://go.dev/doc/go1.185 (Go 1.185のリリースノート。)
- https://go.dev/doc/go1.186 (Go 1.186のリリースノート。)
- https://go.dev/doc/go1.187 (Go 1.187のリリースノート。)
- https://go.dev/doc/go1.188 (Go 1.188のリリースノート。)
- https://go.dev/doc/go1.189 (Go 1.189のリリースノート。)
- https://go.dev/doc/go1.190 (Go 1.190のリリースノート。)
- https://go.dev/doc/go1.191 (Go 1.191のリリースノート。)
- https://go.dev/doc/go1.192 (Go 1.192のリリースノート。)
- https://go.dev/doc/go1.193 (Go 1.193のリリースノート。)
- https://go.dev/doc/go1.194 (Go 1.194のリリースノート。)
- https://go.dev/doc/go1.195 (Go 1.195のリリースノート。)
- https://go.dev/doc/go1.196 (Go 1.196のリリースノート。)
- https://go.dev/doc/go1.197 (Go 1.197のリリースノート。)
- https://go.dev/doc/go1.198 (Go 1.198のリリースノート。)
- https://go.dev/doc/go1.199 (Go 1.199のリリースノート。)
- https://go.dev/doc/go1.200 (Go 1.200のリリースノート。)
- https://go.dev/doc/go1.201 (Go 1.201のリリースノート。)
- https://go.dev/doc/go1.202 (Go 1.202のリリースノート。)
- https://go.dev/doc/go1.203 (Go 1.203のリリースノート。)
- https://go.dev/doc/go1.204 (Go 1.204のリリースノート。)
- https://go.dev/doc/go1.205 (Go 1.205のリリースノート。)
- https://go.dev/doc/go1.206 (Go 1.206のリリースノート。)
- https://go.dev/doc/go1.207 (Go 1.207のリリースノート。)
- https://go.dev/doc/go1.208 (Go 1.208のリリースノート。)
- https://go.dev/doc/go1.209 (Go 1.209のリリースノート。)
- https://go.dev/doc/go1.210 (Go 1.210のリリースノート。)
- https://go.dev/doc/go1.211 (Go 1.211のリリースノート。)
- https://go.dev/doc/go1.212 (Go 1.212のリリースノート。)
- https://go.dev/doc/go1.213 (Go 1.213のリリースノート。)
- https://go.dev/doc/go1.214 (Go 1.214のリリースノート。)
- https://go.dev/doc/go1.215 (Go 1.215のリリースノート。)
- https://go.dev/doc/go1.216 (Go 1.216のリリースノート。)
- https://go.dev/doc/go1.217 (Go 1.217のリリースノート。)
- https://go.dev/doc/go1.218 (Go 1.218のリリースノート。)
- https://go.dev/doc/go1.219 (Go 1.219のリリースノート。)
- https://go.dev/doc/go1.220 (Go 1.220のリリースノート。)
- https://go.dev/doc/go1.221 (Go 1.221のリリースノート。)
- https://go.dev/doc/go1.222 (Go 1.222のリリースノート。)
- https://go.dev/doc/go1.223 (Go 1.223のリリースノート。)
- https://go.dev/doc/go1.224 (Go 1.224のリリースノート。)
- https://go.dev/doc/go1.225 (Go 1.225のリリースノート。)
- https://go.dev/doc/go1.226 (Go 1.226のリリースノート。)
- https://go.dev/doc/go1.227 (Go 1.227のリリースノート。)
- https://go.dev/doc/go1.228 (Go 1.228のリリースノート。)
- https://go.dev/doc/go1.229 (Go 1.229のリリースノート。)
- https://go.dev/doc/go1.230 (Go 1.230のリリースノート。)
- https://go.dev/doc/go1.231 (Go 1.231のリリースノート。)
- https://go.dev/doc/go1.232 (Go 1.232のリリースノート。)
- https://go.dev/doc/go1.233 (Go 1.233のリリースノート。)
- https://go.dev/doc/go1.234 (Go 1.234のリリースノート。)
- https://go.dev/doc/go1.235 (Go 1.235のリリースノート。)
- https://go.dev/doc/go1.236 (Go 1.236のリリースノート。)
- https://go.dev/doc/go1.237 (Go 1.237のリリースノート。)
- https://go.dev/doc/go1.238 (Go 1.238のリリースノート。)
- https://go.dev/doc/go1.239 (Go 1.239のリリースノート。)
- https://go.dev/doc/go1.240 (Go 1.240のリリースノート。)
- https://go.dev/doc/go1.241 (Go 1.241のリリースノート。)
- https://go.dev/doc/go1.242 (Go 1.242のリリースノート。)
- https://go.dev/doc/go1.243 (Go 1.243のリリースノート。)
- https://go.dev/doc/go1.244 (Go 1.244のリリースノート。)
- https://go.dev/doc/go1.245 (Go 1.245のリリースノート。)
- https://go.dev/doc/go1.246 (Go 1.246のリリースノート。)
- https://go.dev/doc/go1.247 (Go 1.247のリリースノート。)
- https://go.dev/doc/go1.248 (Go 1.248のリリースノート。)
- https://go.dev/doc/go1.249 (Go 1.249のリリースノート。)
- https://go.dev/doc/go1.250 (Go 1.250のリリースノート。)
- https://go.dev/doc/go1.251 (Go 1.251のリリースノート。)
- https://go.dev/doc/go1.252 (Go 1.252のリリースノート。)
- https://go.dev/doc/go1.253 (Go 1.253のリリースノート。)
- https://go.dev/doc/go1.254 (Go 1.254のリリースノート。)
- https://go.dev/doc/go1.255 (Go 1.255のリリースノート。)
- https://go.dev/doc/go1.256 (Go 1.256のリリースノート。)
- https://go.dev/doc/go1.257 (Go 1.257のリリースノート。)
- https://go.dev/doc/go1.258 (Go 1.258のリリースノート。)
- https://go.dev/doc/go1.259 (Go 1.259のリリースノート。)
- https://go.dev/doc/go1.260 (Go 1.260のリリースノート。)
- https://go.dev/doc/go1.261 (Go 1.261のリリースノート。)
- https://go.dev/doc/go1.262 (Go 1.262のリリースノート。)
- https://go.dev/doc/go1.263 (Go 1.263のリリースノート。)
- https://go.dev/doc/go1.264 (Go 1.264のリリースノート。)
- https://go.dev/doc/go1.265 (Go 1.265のリリースノート。)
- https://go.dev/doc/go1.266 (Go 1.266のリリースノート。)
- https://go.dev/doc/go1.267 (Go 1.267のリリースノート。)
- https://go.dev/doc/go1.268 (Go 1.268のリリースノート。)
- https://go.dev/doc/go1.269 (Go 1.269のリリースノート。)
- https://go.dev/doc/go1.270 (Go 1.270のリリースノート。)
- https://go.dev/doc/go1.271 (Go 1.271のリリースノート。)
- https://go.dev/doc/go1.272 (Go 1.272のリリースノート。)
- https://go.dev/doc/go1.273 (Go 1.273のリリースノート。)
- https://go.dev/doc/go1.274 (Go 1.274のリリースノート。)
- https://go.dev/doc/go1.275 (Go 1.275のリリースノート。)
- https://go.dev/doc/go1.276 (Go 1.276のリリースノート。)
- https://go.dev/doc/go1.277 (Go 1.277のリリースノート。)
- https://go.dev/doc/go1.278 (Go 1.278のリリースノート。)
- https://go.dev/doc/go1.279 (Go 1.279のリリースノート。)
- https://go.dev/doc/go1.280 (Go 1.280のリリースノート。)
- https://go.dev/doc/go1.281 (Go 1.281のリリースノート。)
- https://go.dev/doc/go1.282 (Go 1.282のリリースノート。)
- https://go.dev/doc/go1.283 (Go 1.283のリリースノート。)
- https://go.dev/doc/go1.284 (Go 1.284のリリースノート。)
- https://go.dev/doc/go1.285 (Go 1.285のリリースノート。)
- https://go.dev/doc/go1.286 (Go 1.286のリリースノート。)
- https://go.dev/doc/go1.287 (Go 1.287のリリースノート。)
- https://go.dev/doc/go1.288 (Go 1.288のリリースノート。)
- https://go.dev/doc/go1.289 (Go 1.289のリリースノート。)
- https://go.dev/doc/go1.290 (Go 1.290のリリースノート。)
- https://go.dev/doc/go1.291 (Go 1.291のリリースノート。)
- https://go.dev/doc/go1.292 (Go 1.292のリリースノート。)
- https://go.dev/doc/go1.293 (Go 1.293のリリースノート。)
- https://go.dev/doc/go1.294 (Go 1.294のリリースノート。)
- https://go.dev/doc/go1.295 (Go 1.295のリリースノート。)
- https://go.dev/doc/go1.296 (Go 1.296のリリースノート。)
- https://go.dev/doc/go1.297 (Go 1.297のリリースノート。)
- https://go.dev/doc/go1.298 (Go 1.298のリリースノート。)
- https://go.dev/doc/go1.299 (Go 1.299のリリースノート。)
- https://go.dev/doc/go1.300 (Go 1.300のリリースノート。)
- https://go.dev/doc/go1.301 (Go 1.301のリリースノート。)
- https://go.dev/doc/go1.302 (Go 1.302のリリースノート。)
- https://go.dev/doc/go1.303 (Go 1.303のリリースノート。)
- https://go.dev/doc/go1.304 (Go 1.304のリリースノート。)
- https://go.dev/doc/go1.305 (Go 1.305のリリースノート。)
- https://go.dev/doc/go1.306 (Go 1.306のリリースノート。)
- https://go.dev/doc/go1.307 (Go 1.307のリリースノート。)
- https://go.dev/doc/go1.308 (Go 1.308のリリースノート。)
- https://go.dev/doc/go1.309 (Go 1.309のリリースノート。)
- https://go.dev/doc/go1.310 (Go 1.310のリリースノート。)
- https://go.dev/doc/go1.311 (Go 1.311のリリースノート。)
- https://go.dev/doc/go1.312 (Go 1.312のリリースノート。)
- https://go.dev/doc/go1.313 (Go 1.313のリリースノート。)
- https://go.dev/doc/go1.314 (Go 1.314のリリースノート。)
- https://go.dev/doc/go1.315 (Go 1.315のリリースノート。)
- https://go.dev/doc/go1.316 (Go 1.316のリリースノート。)
- https://go.dev/doc/go1.317 (Go 1.317のリリースノート。)
- https://go.dev/doc/go1.318 (Go 1.318のリリースノート。)
- https://go.dev/doc/go1.319 (Go 1.319のリリースノート。)
- https://go.dev/doc/go1.320 (Go 1.320のリリースノート。)
- https://go.dev/doc/go1.321 (Go 1.321のリリースノート。)
- https://go.dev/doc/go1.322 (Go 1.322のリリースノート。)
- https://go.dev/doc/go1.323 (Go 1.323のリリースノート。)
- https://go.dev/doc/go1.324 (Go 1.324のリリースノート。)
- https://go.dev/doc/go1.325 (Go 1.325のリリースノート。)
- https://go.dev/doc/go1.326 (Go 1.326のリリースノート。)
- https://go.dev/doc/go1.327 (Go 1.327のリリースノート。)
- https://go.dev/doc/go1.328 (Go 1.328のリリースノート。)
- https://go.dev/doc/go1.329 (Go 1.329のリリースノート。)
- https://go.dev/doc/go1.330 (Go 1.330のリリースノート。)
- https://go.dev/doc/go1.331 (Go 1.331のリリースノート。)
- https://go.dev/doc/go1.332 (Go 1.332のリリースノート。)
- https://go.dev/doc/go1.333 (Go 1.333のリリースノート。)
- https://go.dev/doc/go1.334 (Go 1.334のリリースノート。)
- https://go.dev/doc/go1.335 (Go 1.335のリリースノート。)
- https://go.dev/doc/go1.336 (Go 1.336のリリースノート。)
- https://go.dev/doc/go1.337 (Go 1.337のリリースノート。)
- https://go.dev/doc/go1.338 (Go 1.338のリリースノート。)
- https://go.dev/doc/go1.339 (Go 1.339のリリースノート。)
- https://go.dev/doc/go1.340 (Go 1.340のリリースノート。)
- https://go.dev/doc/go1.341 (Go 1.341のリリースノート。)
- https://go.dev/doc/go1.342 (Go 1.342のリリースノート。)
- https://go.dev/doc/go1.343 (Go 1.343のリリースノート。)
- https://go.dev/doc/go1.344 (Go 1.344のリリースノート。)
- https://go.dev/doc/go1.345 (Go 1.345のリリースノート。)
- https://go.dev/doc/go1.346 (Go 1.346のリリースノート。)
- https://go.dev/doc/go1.347 (Go 1.347のリリースノート。)
- https://go.dev/doc/go1.348 (Go 1.348のリリースノート。)
- https://go.dev/doc/go1.349 (Go 1.349のリリースノート。)
- https://go.dev/doc/go1.350 (Go 1.350のリリースノート。)
- https://go.dev/doc/go1.351 (Go 1.351のリリースノート。)
- https://go.dev/doc/go1.352 (Go 1.352のリリースノート。)
- https://go.dev/doc/go1.353 (Go 1.353のリリースノート。)
- https://go.dev/doc/go1.354 (Go 1.354のリリースノート。)
- https://go.dev/doc/go1.355 (Go 1.355のリリースノート。)
- https://go.dev/doc/go1.356 (Go 1.356のリリースノート。)
- https://go.dev/doc/go1.357 (Go 1.357のリリースノート。)
- https://go.dev/doc/go1.358 (Go 1.358のリリースノート。)
- https://go.dev/doc/go1.359 (Go 1.359のリリースノート。)
- https://go.dev/doc/go1.360 (Go 1.360のリリースノート。)
- https://go.dev/doc/go1.361 (Go 1.361のリリースノート。)
- https://go.dev/doc/go1.362 (Go 1.362のリリースノート。)
- https://go.dev/doc/go1.363 (Go 1.363のリリースノート。)
- https://go.dev/doc/go1.364 (Go 1.364のリリースノート。)
- https://go.dev/doc/go1.365 (Go 1.365のリリースノート。)
- https://go.dev/doc/go1.366 (Go 1.366のリリースノート。)
- https://go.dev/doc/go1.367 (Go 1.367のリリースノート。)
- https://go.dev/doc/go1.368 (Go 1.368のリリースノート。)
- https://go.dev/doc/go1.369 (Go 1.369のリリースノート。)
- https://go.dev/doc/go1.370 (Go 1.370のリリースノート。)
- https://go.dev/doc/go1.371 (Go 1.371のリリースノート。)
- https://go.dev/doc/go1.372 (Go 1.372のリリースノート。)
- https://go.dev/doc/go1.373 (Go 1.373のリリースノート。)
- https://go.dev/doc/go1.374 (Go 1.374のリリースノート。)
- https://go.dev/doc/go1.375 (Go 1.375のリリースノート。)
- https://go.dev/doc/go1.376 (Go 1.376のリリースノート。)
- https://go.dev/doc/go1.377 (Go 1.377のリリースノート。)
- https://go.dev/doc/go1.378 (Go 1.378のリリースノート。)
- https://go.dev/doc/go1.379 (Go 1.379のリリースノート。)
- https://go.dev/doc/go1.380 (Go 1.380のリリースノート。)
- https://go.dev/doc/go1.381 (Go 1.381のリリースノート。)
- https://go.dev/doc/go1.382 (Go 1.382のリリースノート。)
- https://go.dev/doc/go1.383 (Go 1.383のリリースノート。)
- https://go.dev/doc/go1.384 (Go 1.384のリリースノート。)
- https://go.dev/doc/go1.385 (Go 1.385のリリースノート。)
- https://go.dev/doc/go1.386 (Go 1.386のリリースノート。)
- https://go.dev/doc/go1.387 (Go 1.387のリリースノート。)
- https://go.dev/doc/go1.388 (Go 1.388のリリースノート。)
- https://go.dev/doc/go1.389 (Go 1.389のリリースノート。)
- https://go.dev/doc/go1.390 (Go 1.390のリリースノート。)
- https://go.dev/doc/go1.391 (Go 1.391のリリースノート。)
- https://go.dev/doc/go1.392 (Go 1.392のリリースノート。)
- https://go.dev/doc/go1.393 (Go 1.393のリリースノート。)
- https://go.dev/doc/go1.394 (Go 1.394のリリースノート。)
- https://go.dev/doc/go1.395 (Go 1.395のリリースノート。)
- https://go.dev/doc/go1.396 (Go 1.396のリリースノート。)
- https://go.dev/doc/go1.397 (Go 1.397のリリースノート。)
- https://go.dev/doc/go1.398 (Go 1.398のリリースノート。)
- https://go.dev/doc/go1.399 (Go 1.399のリリースノート。)
- https://go.dev/doc/go1.400 (Go 1.400のリリースノート。)
- https://go.dev/doc/go1.401 (Go 1.401のリリースノート。)
- https://go.dev/doc/go1.402 (Go 1.402のリリースノート。)
- https://go.dev/doc/go1.403 (Go 1.403のリリースノート。)
- https://go.dev/doc/go1.404 (Go 1.404のリリースノート。)
- https://go.dev/doc/go1.405 (Go 1.405のリリースノート。)
- https://go.dev/doc/go1.406 (Go 1.406のリリースノート。)
- https://go.dev/doc/go1.407 (Go 1.407のリリースノート。)
- https://go.dev/doc/go1.408 (Go 1.408のリリースノート。)
- https://go.dev/doc/go1.409 (Go 1.409のリリースノート。)
- https://go.dev/doc/go1.410 (Go 1.410のリリースノート。)
- https://go.dev/doc/go1.411 (Go 1.411のリリースノート。)
- https://go.dev/doc/go1.412 (Go 1.412のリリースノート。)
- https://go.dev/doc/go1.413 (Go 1.413のリリースノート。)
- https://go.dev/doc/go1.414 (Go 1.414のリリースノート。)
- https://go.dev/doc/go1.415 (Go 1.415のリリースノート。)
- https://go.dev/doc/go1.416 (Go 1.416のリリースノート。)
- https://go.dev/doc/go1.417 (Go 1.417のリリースノート。)
- https://go.dev/doc/go1.418 (Go 1.418のリリースノート。)
- https://go.dev/doc/go1.419 (Go 1.419のリリースノート。)
- https://go.dev/doc/go1.420 (Go 1.420のリリースノート。)
- https://go.dev/doc/go1.421 (Go 1.421のリリースノート。)
- https://go.dev/doc/go1.422 (Go 1.422のリリースノート。)
- https://go.dev/doc/go1.423 (Go 1.423のリリースノート。)
- https://go.dev/doc/go1.424 (Go 1.424のリリースノート。)
- https://go.dev/doc/go1.425 (Go 1.425のリリースノート。)
- https://go.dev/doc/go1.426 (Go 1.426のリリースノート。)
- https://go.dev/doc/go1.427 (Go 1.427のリリースノート。)
- https://go.dev/doc/go1.428 (Go 1.428のリリースノート。)
- https://go.dev/doc/go1.429 (Go 1.429のリリースノート。)
- https://go.dev/doc/go1.430 (Go 1.430のリリースノート。)
- https://go.dev/doc/go1.431 (Go 1.431のリリースノート。)
- https://go.dev/doc/go1.432 (Go 1.432のリリースノート。)
- https://go.dev/doc/go1.433 (Go 1.433のリリースノート。)
- https://go.dev/doc/go1.434 (Go 1.434のリリースノート。)
- https://go.dev/doc/go1.435 (Go 1.435のリリースノート。)
- https://go.dev/doc/go1.436 (Go 1.436のリリースノート。)
- https://go.dev/doc/go1.437 (Go 1.437のリリースノート。)
- https://go.dev/doc/go1.438 (Go 1.438のリリースノート。)
- https://go.dev/doc/go1.439 (Go 1.439のリリースノート。)
- https://go.dev/doc/go1.440 (Go 1.440のリリースノート。)
- https://go.dev/doc/go1.441 (Go 1.441のリリースノート。)
- https://go.dev/doc/go1.442 (Go 1.442のリリースノート。)
- https://go.dev/doc/go1.443 (Go 1.443のリリースノート。)
- https://go.dev/doc/go1.444 (Go 1.444のリリースノート。)
- https://go.dev/doc/go1.445 (Go 1.445のリリースノート。)
- https://go.dev/doc/go1.446 (Go 1.446のリリースノート。)
- https://go.dev/doc/go1.447 (Go 1.447のリリースノート。)
- https://go.dev/doc/go1.448 (Go 1.448のリリースノート。)
- https://go.dev/doc/go1.449 (Go 1.449のリリースノート。)
- https://go.dev/doc/go1.450 (Go 1.450のリリースノート。)
- https://go.dev/doc/go1.451 (Go 1.451のリリースノート。)
- https://go.dev/doc/go1.452 (Go 1.452のリリースノート。)
- https://go.dev/doc/go1.453 (Go 1.453のリリースノート。)
- https://go.dev/doc/go1.454 (Go 1.454のリリースノート。)
- https://go.dev/doc/go1.455 (Go 1.455のリリースノート。)
- https://go.dev/doc/go1.456 (Go 1.456のリリースノート。)
- https://go.dev/doc/go1.457 (Go 1.457のリリースノート。)
- https://go.dev/doc/go1.458 (Go 1.458のリリースノート。)
- https://go.dev/doc/go1.459 (Go 1.459のリリースノート。)
- https://go.dev/doc/go1.460 (Go 1.460のリリースノート。)
- https://go.dev/doc/go1.461 (Go 1.461のリリースノート。)
- https://go.dev/doc/go1.462 (Go 1.462のリリースノート。)
- https://go.dev/doc/go1.463 (Go 1.463のリリースノート。)
- https://go.dev/doc/go1.464 (Go 1.464のリリースノート。)
- https://go.dev/doc/go1.465 (Go 1.465のリリースノート。)
- https://go.dev/doc/go1.466 (Go 1.466のリリースノート。)
- https://go.dev/doc/go1.467 (Go 1.467のリリースノート。)
- https://go.dev/doc/go1.468 (Go 1.468のリリースノート。)
- https://go.dev/doc/go1.469 (Go 1.469のリリースノート。)
- https://go.dev/doc/go1.470 (Go 1.470のリリースノート。)
- https://go.dev/doc/go1.471 (Go 1.471のリリースノート。)
- https://go.dev/doc/go1.472 (Go 1.472のリリースノート。)
- https://go.dev/doc/go1.473 (Go 1.473のリリースノート。)
- https://go.dev/doc/go1.474 (Go 1.474のリリースノート。)
- https://go.dev/doc/go1.475 (Go 1.475のリリースノート。)
- https://go.dev/doc/go1.476 (Go 1.476のリリースノート。)
- https://go.dev/doc/go1.477 (Go 1.477のリリースノート。)
- https://go.dev/doc/go1.478 (Go 1.478のリリースノート。)
- https://go.dev/doc/go1.479 (Go 1.479のリリースノート。)
- https://go.dev/doc/go1.480 (Go 1.480のリリースノート。)
- https://go.dev/doc/go1.481 (Go 1.481のリリースノート。)
- https://go.dev/doc/go1.482 (Go 1.482のリリースノート。)
- https://go.dev/doc/go1.483 (Go 1.483のリリースノート。)
- https://go.dev/doc/go1.484 (Go 1.484のリリースノート。)
- https://go.dev/doc/go1.485 (Go 1.485のリリースノート。)
- https://go.dev/doc/go1.486 (Go 1.486のリリースノート。)
- https://go.dev/doc/go1.487 (Go 1.487のリリースノート。)
- https://go.dev/doc/go1.488 (Go 1.488のリリースノート。)
- https://go.dev/doc/go1.489 (Go 1.489のリリースノート。)
- https://go.dev/doc/go1.490 (Go 1.490のリリースノート。)
- https://go.dev/doc/go1.491 (Go 1.491のリリースノート。)
- https://go.dev/doc/go1.492 (Go 1.492のリリースノート。)
- https://go.dev/doc/go1.493 (Go 1.493のリリースノート。)
- https://go.dev/doc/go1.494 (Go 1.494のリリースノート。)
- https://go.dev/doc/go1.495 (Go 1.495のリリースノート。)
- https://go.dev/doc/go1.496 (Go 1.496のリリースノート。)
- https://go.dev/doc/go1.497 (Go 1.497のリリースノート。)
- https://go.dev/doc/go1.498 (Go 1.498のリリースノート。)
- https://go.dev/doc/go1.499 (Go 1.499のリリースノート。)
- https://go.dev/doc/go1.500 (Go 1.500のリリースノート。)
- https://go.dev/doc/go1.501 (Go 1.501のリリースノート。)
- https://go.dev/doc/go1.502 (Go 1.502のリリースノート。)
- https://go.dev/doc/go1.503 (Go 1.503のリリースノート。)
- https://go.dev/doc/go1.504 (Go 1.504のリリースノート。)
- https://go.dev/doc/go1.505 (Go 1.505のリリースノート。)
- https://go.dev/doc/go1.506 (Go 1.506のリリースノート。)
- https://go.dev/doc/go1.507 (Go 1.507のリリースノート。)
- https://go.dev/doc/go1.508 (Go 1.508のリリースノート。)
- https://go.dev/doc/go1.509 (Go 1.509のリリースノート。)
- https://go.dev/doc/go1.510 (Go 1.510のリリースノート。)
- https://go.dev/doc/go1.511 (Go 1.511のリリースノート。)
- https://go.dev/doc/go1.512 (Go 1.512のリリースノート。)
- https://go.dev/doc/go1.513 (Go 1.513のリリースノート。)
- https://go.dev/doc/go1.514 (Go 1.514のリリースノート。)
- https://go.dev/doc/go1.515 (Go 1.515のリリースノート。)
- https://go.dev/doc/go1.516 (Go 1.516のリリースノート。)
- https://go.dev/doc/go1.517 (Go 1.517のリリースノート。)
- https://go.dev/doc/go1.518 (Go 1.518のリリースノート。)
- https://go.dev/doc/go1.519 (Go 1.519のリリースノート。)
- https://go.dev/doc/go1.520 (Go 1.520のリリースノート。)
- https://go.dev/doc/go1.521 (Go 1.521のリリースノート。)
- https://go.dev/doc/go1.522 (Go 1.522のリリースノート。)
- https://go.dev/doc/go1.523 (Go 1.523のリリースノート。)
- https://go.dev/doc/go1.524 (Go 1.524のリリースノート。)
- https://go.dev/doc/go1.525 (Go 1.525のリリースノート。)
- https://go.dev/doc/go1.526 (Go 1.526のリリースノート。)
- https://go.dev/doc/go1.527 (Go 1.527のリリースノート。)
- https://go.dev/doc/go1.528 (Go 1.528のリリースノート。)
- https://go.dev/doc/go1.529 (Go 1.529のリリースノート。)
- https://go.dev/doc/go1.530 (Go 1.530のリリースノート。)
- https://go.dev/doc/go1.531 (Go 1.531のリリースノート。)
- https://go.dev/doc/go1.532 (Go 1.532のリリースノート。)
- https://go.dev/doc/go1.533 (Go 1.533のリリースノート。)
- https://go.dev/doc/go1.534 (Go 1.534のリリースノート。)
- https://go.dev/doc/go1.535 (Go 1.535のリリースノート。)
- https://go.dev/doc/go1.536 (Go 1.536のリリースノート。)
- https://go.dev/doc/go1.537 (Go 1.537のリリースノート。)
- https://go.dev/doc/go1.538 (Go 1.538のリリースノート。)
- https://go.dev/doc/go1.539 (Go 1.539のリリースノート。)
- https://go.dev/doc/go1.540 (Go 1.540のリリースノート。)
- https://go.dev/doc/go1.541 (Go 1.541のリリースノート。)
- https://go.dev/doc/go1.542 (Go 1.542のリリースノート。)
- https://go.dev/doc/go1.543 (Go 1.543のリリースノート。)
- https://go.dev/doc/go1.544 (Go 1.544のリリースノート。)
- https://go.dev/doc/go1.545 (Go 1.545のリリースノート。)
- https://go.dev/doc/go1.546 (Go 1.546のリリースノート。)
- https://go.dev/doc/go1.547 (Go 1.547のリリースノート。)
- https://go.dev/doc/go1.548 (Go 1.548のリリースノート。)
- https://go.dev/doc/go1.549 (Go 1.549のリリースノート。)
- https://go.dev/doc/go1.550 (Go 1.550のリリースノート。)
- https://go.dev/doc/go1.551 (Go 1.551のリリースノート。)
- https://go.dev/doc/go1.552 (Go 1.552のリリースノート。)
- https://go.dev/doc/go1.553 (Go 1.553のリリースノート。)
- https://go.dev/doc/go1.554 (Go 1.554のリリースノート。)
- https://go.dev/doc/go1.555 (Go 1.555のリリースノート。)
- https://go.dev/doc/go1.556 (Go 1.556のリリースノート。)
- https://go.dev/doc/go1.557 (Go 1.557のリリースノート。)
- https://go.dev/doc/go1.558 (Go 1.558のリリースノート。)
- https://go.dev/doc/go1.559 (Go 1.559のリリースノート。)
- https://go.dev/doc/go1.560 (Go 1.560のリリースノート。)
- https://go.dev/doc/go1.561 (Go 1.561のリリースノート。)
- https://go.dev/doc/go1.562 (Go 1.562のリリースノート。)
- https://go.dev/doc/go1.563 (Go 1.563のリリースノート。)
- https://go.dev/doc/go1.564 (Go 1.564のリリースノート。)
- https://go.dev/doc/go1.565 (Go 1.565のリリースノート。)
- https://go.dev/doc/go1.566 (Go 1.566のリリースノート。)
- https://go.dev/doc/go1.567 (Go 1.567のリリースノート。)
- https://go.dev/doc/go1.568 (Go 1.568のリリースノート。)
- https://go.dev/doc/go1.569 (Go 1.569のリリースノート。)
- https://go.dev/doc/go1.570 (Go 1.570のリリースノート。)
- https://go.dev/doc/go1.571 (Go 1.571のリリースノート。)
- https://go.dev/doc/go1.572 (Go 1.572のリリースノート。)
- https://go.dev/doc/go1.573 (Go 1.573のリリースノート。)
- https://go.dev/doc/go1.574 (Go 1.574のリリースノート。)
- https://go.dev/doc/go1.575 (Go 1.575のリリースノート。)
- https://go.dev/doc/go1.576 (Go 1.576のリリースノート。)
- https://go.dev/doc/go1.577 (Go 1.577のリリースノート。)
- https://go.dev/doc/go1.578 (Go 1.578のリリースノート。)
- https://go.dev/doc/go1.579 (Go 1.579のリリースノート。)
- https://go.dev/doc/go1.580 (Go 1.580のリリースノート。)
- https://go.dev/doc/go1.581 (Go 1.581のリリースノート。)
- https://go.dev/doc/go1.582 (Go 1.582のリリースノート。)
- https://go.dev/doc/go1.583 (Go 1.583のリリースノート。)
- https://go.dev/doc/go1.584 (Go 1.584のリリースノート。)
- https://go.dev/doc/go1.585 (Go 1.585のリリースノート。)
- https://go.dev/doc/go1.586 (Go 1.586のリリースノート。)
- https://go.dev/doc/go1.587 (Go 1.587のリリースノート。)
- https://go.dev/doc/go1.588 (Go 1.588のリリースノート。)
- https://go.dev/doc/go1.589 (Go 1.589のリリースノート。)
- https://go.dev/doc/go1.590 (Go 1.590のリリースノート。)
- https://go.dev/doc/go1.591 (Go 1.591のリリースノート。)
- https://go.dev/doc/go1.592 (Go 1.592のリリースノート。)
- https://go.dev/doc/go1.593 (Go 1.593のリリースノート。)
- https://go.dev/doc/go1.594 (Go 1.594のリリースノート。)
- https://go.dev/doc/go1.595 (Go 1.595のリリースノート。)
- https://go.dev/doc/go1.596 (Go 1.596のリリースノート。)
- https://go.dev/doc/go1.597 (Go 1.597のリリースノート。)
- https://go.dev/doc/go1.598 (Go 1.598のリリースノート。)
- https://go.dev/doc/go1.599 (Go 1.599のリリースノート。)
- https://go.dev/doc/go1.600 (Go 1.600のリリースノート。)
- https://go.dev/doc/go1.601 (Go 1.601のリリースノート。)
- https://go.dev/doc/go1.602 (Go 1.602のリリースノート。)
- https://go.dev/doc/go1.603 (Go 1.603のリリースノート。)
- https://go.dev/doc/go1.604 (Go 1.604のリリースノート。)
- https://go.dev/doc/go1.605 (Go 1.605のリリースノート。)
- https://go.dev/doc/go1.606 (Go 1.606のリリースノート。)
- https://go.dev/doc/go1.607 (Go 1.607のリリースノート。)
- https://go.dev/doc/go1.608 (Go 1.608のリリースノート。)
- https://go.dev/doc/go1.609 (Go 1.609のリリースノート。)
- https://go.dev/doc/go1.610 (Go 1.610のリリースノート。)
- https://go.dev/doc/go1.611 (Go 1.611のリリースノート。)
- https://go.dev/doc/go1.612 (Go 1.612のリリースノート。)
- https://go.dev/doc/go1.613 (Go 1.613のリリースノート。)
- https://go.dev/doc/go1.614 (Go 1.614のリリースノート。)
- https://go.dev/doc/go1.615 (Go 1.615のリリースノート。)
- https://go.dev/doc/go1.616 (Go 1.616のリリースノート。)
- https://go.dev/doc/go1.617 (Go 1.617のリリースノート。)
- https://go.dev/doc/go1.618 (Go 1.618のリリースノート。)
- https://go.dev/doc/go1.619 (Go 1.619のリリースノート。)
- https://go.dev/doc/go1.620 (Go 1.620のリリースノート。)
- https://go.dev/doc/go1.621 (Go 1.621のリリースノート。)
- https://go.dev/doc/go1.622 (Go 1.622のリリースノート。)
- https://go.dev/doc/go1.623 (Go 1.623のリリースノート。)
- https://go.dev/doc/go1.624 (Go 1.624のリリースノート。)
- https://go.dev/doc/go1.625 (Go 1.625のリリースノート。)
- https://go.dev/doc/go1.626 (Go 1.626のリリースノート。)
- https://go.dev/doc/go1.627 (Go 1.627のリリースノート。)
- https://go.dev/doc/go1.628 (Go 1.628のリリースノート。)
- https://go.dev/doc/go1.629 (Go 1.629のリリースノート。)
- https://go.dev/doc/go1.630 (Go 1.630のリリースノート。)
- https://go.dev/doc/go1.631 (Go 1.631のリリースノート。)
- https://go.dev/doc/go1.632 (Go 1.632のリリースノート。)
- https://go.dev/doc/go1.633 (Go 1.633のリリースノート。)
- https://go.dev/doc/go1.634 (Go 1.634のリリースノート。)
- https://go.dev/doc/go1.635 (Go 1.635のリリースノート。)
- https://go.dev/doc/go1.636 (Go 1.636のリリースノート。)
- https://go.dev/doc/go1.637 (Go 1.637のリリースノート。)
- https://go.dev/doc/go1.638 (Go 1.638のリリースノート。)
- https://go.dev/doc/go1.639 (Go 1.639のリリースノート。)
- https://go.dev/doc/go1.640 (Go 1.640のリリースノート。)
- https://go.dev/doc/go1.641 (Go 1.641のリリースノート。)
- https://go.dev/doc/go1.642 (Go 1.642のリリースノート。)
- https://go.dev/doc/go1.643 (Go 1.643のリリースノート。)
- https://go.dev/doc/go1.644 (Go 1.644のリリースノート。)
- https://go.dev/doc/go1.645 (Go 1.645のリリースノート。)
- https://go.dev/doc/go1.646 (Go 1.646のリリースノート。)
- https://go.dev/doc/go1.647 (Go 1.647のリリースノート。)
- https://go.dev/doc/go1.648 (Go 1.648のリリースノート。)
- https://go.dev/doc/go1.649 (Go 1.649のリリースノート。)
- https://go.dev/doc/go1.650 (Go 1.650のリリースノート。)
- https://go.dev/doc/go1.651 (Go 1.651のリリースノート。)
- https://go.dev/doc/go1.652 (Go 1.652のリリースノート。)
- https://go.dev/doc/go1.653 (Go 1.653のリリースノート。)
- https://go.dev/doc/go1.654 (Go 1.654のリリースノート。)
- https://go.dev/doc/go1.655 (Go 1.655のリリースノート。)
- https://go.dev/doc/go1.656 (Go 1.656のリリースノート。)
- https://go.dev/doc/go1.657 (Go 1.657のリリースノート。)
- https://go.dev/doc/go1.658 (Go 1.658のリリースノート。)
- https://go.dev/doc/go1.659 (Go 1.659のリリースノート。)
- https://go.dev/doc/go1.660 (Go 1.660のリリースノート。)
- https://go.dev/doc/go1.661 (Go 1.661のリリースノート。)
- https://go.dev/doc/go1.662 (Go 1.662のリリースノート。)
- https://go.dev/doc/go1.663 (Go 1.663のリリースノート。)
- https://go.dev/doc/go1.664 (Go 1.664のリリースノート。)
- https://go.dev/doc/go1.665 (Go 1.665のリリースノート。)
- https://go.dev/doc/go1.666 (Go 1.666のリリースノート。)
- https://go.dev/doc/go1.667 (Go 1.667のリリースノート。)
- https://go.dev/doc/go1.668 (Go 1.668のリリースノート。)
- https://go.dev/doc/go1.669 (Go 1.669のリリースノート。)
- https://go.dev/doc/go1.670 (Go 1.670のリリースノート。)
- https://go.dev/doc/go1.671 (Go 1.671のリリースノート。)
- https://go.dev/doc/go1.672 (Go 1.672のリリースノート。)
- https://go.dev/doc/go1.673 (Go 1.673のリリースノート。)
- https://go.dev/doc/go1.674 (Go 1.674のリリースノート。)
- https://go.dev/doc/go1.675 (Go 1.675のリリースノート。)
- https://go.dev/doc/go1.676 (Go 1.676のリリースノート。)
- https://go.dev/doc/go1.677 (Go 1.677のリリースノート。)
- https://go.dev/doc/go1.678 (Go 1.678のリリースノート。)
- https://go.dev/doc/go1.679 (Go 1.679のリリースノート。)
- https://go.dev/doc/go1.680 (Go 1.680のリリースノート。)
- https://go.dev/doc/go1.681 (Go 1.681のリリースノート。)
- https://go.dev/doc/go1.682 (Go 1.682のリリースノート。)
- https://go.dev/doc/go1.683 (Go 1.683のリリースノート。)
- https://go.dev/doc/go1.684 (Go 1.684のリリースノート。)
- https://go.dev/doc/go1.685 (Go 1.685のリリースノート。)
- https://go.dev/doc/go1.686 (Go 1.686のリリースノート。)
- https://go.dev/doc/go1.687 (Go 1.687のリリースノート。)
- https://go.dev/doc/go1.688 (Go 1.688のリリースノート。)
- https://go.dev/doc/go1.689 (Go 1.689のリリースノート。)
- https://go.dev/doc/go1.690 (Go 1.690のリリースノート。)
- https://go.dev/doc/go1.691 (Go 1.691のリリースノート。)
- https://go.dev/doc/go1.692 (Go 1.692のリリースノート。)
- https://go.dev/doc/go1.693 (Go 1.693のリリースノート。)
- https://go.dev/doc/go1.694 (Go 1.694のリリースノート。)
- https://go.dev/doc/go1.695 (Go 1.695のリリースノート。)
- https://go.dev/doc/go1.696 (Go 1.696のリリースノート。)
- https://go.dev/doc/go1.697 (Go 1.697のリリースノート。)
- https://go.dev/doc/go1.698 (Go 1.698のリリースノート。)
- https://go.dev/doc/go1.699 (Go 1.699のリリースノート。)
- https://go.dev/doc/go1.700 (Go 1.700のリリースノート。)
- https://go.dev/doc/go1.701 (Go 1.701のリリースノート。)
- https://go.dev/doc/go1.702 (Go 1.702のリリースノート。)
- https://go.dev/doc/go1.703 (Go 1.703のリリースノート。)
- https://go.dev/doc/go1.704 (Go 1.704のリリースノート。)
- https://go.dev/doc/go1.705 (Go 1.705のリリースノート。)
- https://go.dev/doc/go1.706 (Go 1.706のリリースノート。)
- https://go.dev/doc/go1.707 (Go 1.707のリリースノート。)
- https://go.dev/doc/go1.708 (Go 1.708のリリースノート。)
- https://go.dev/doc/go1.709 (Go 1.709のリリースノート。)
- https://go.dev/doc/go1.710 (Go 1.710のリリースノート。)
- https://go.dev/doc/go1.711 (Go 1.711のリリースノート。)
- https://go.dev/doc/go1.712 (Go 1.712のリリースノート。)
- https://go.dev/doc/go1.713 (Go 1.713のリリースノート。)
- https://go.dev/doc/go1.714 (Go 1.714のリリースノート。)
- https://go.dev/doc/go1.715 (Go 1.715のリリースノート。)
- https://go.dev/doc/go1.716 (Go 1.716のリリースノート。)
- https://go.dev/doc/go1.717 (Go 1.717のリリースノート。)
- https://go.dev/doc/go1.718 (Go 1.718のリリースノート。)
- https://go.dev/doc/go1.719 (Go 1.719のリリースノート。)
- https://go.dev/doc/go1.720 (Go 1.720のリリースノート。)
- https://go.dev/doc/go1.721 (Go 1.721のリリースノート。)
- https://go.dev/doc/go1.722 (Go 1.722のリリースノート。)
- https://go.dev/doc/go1.723 (Go 1.723のリリースノート。)
- https://go.dev/doc/go1.724 (Go 1.724のリリースノート。)
- https://go.dev/doc/go1.725 (Go 1.725のリリースノート。)
- https://go.dev/doc/go1.726 (Go 1.726のリリースノート。)
- https://go.dev/doc/go1.727 (Go 1.727のリリースノート。)
- https://go.dev/doc/go1.728 (Go 1.728のリリースノート。)
- https://go.dev/doc/go1.729 (Go 1.729のリリースノート。)
- https://go.dev/doc/go1.730 (Go 1.730のリリースノート。)
- https://go.dev/doc/go1.731 (Go 1.731のリリースノート。)
- https://go.dev/doc/go1.732 (Go 1.732のリリースノート。)
- https://go.dev/doc/go1.733 (Go 1.733のリリースノート。)
- https://go.dev/doc/go1.734 (Go 1.734のリリースノート。)
- https://go.dev/doc/go1.735 (Go 1.735のリリースノート。)
- https://go.dev/doc/go1.736 (Go 1.736のリリースノート。)
- https://go.dev/doc/go1.737 (Go 1.737のリリースノート。)
- https://go.dev/doc/go1.738 (Go 1.738のリリースノート。)
- https://go.dev/doc/go1.739 (Go 1.739のリリースノート。)
- https://go.dev/doc/go1.740 (Go 1.740のリリースノート。)
- https://go.dev/doc/go1.741 (Go 1.741のリリースノート。)
- https://go.dev/doc/go1.742 (Go 1.742のリリースノート。)
- https://go.dev/doc/go1.743 (Go 1.743のリリースノート。)
- https://go.dev/doc/go1.744 (Go 1.744のリリースノート。)
- https://go.dev/doc/go1.745 (Go 1.745のリリースノート。)
- https://go.dev/doc/go1.746 (Go 1.746のリリースノート。)
- https://go.dev/doc/go1.747 (Go 1.747のリリースノート。)
- https://go.dev/doc/go1.748 (Go 1.748のリリースノート。)
- https://go.dev/doc/go1.749 (Go 1.749のリリースノート。)
- https://go.dev/doc/go1.750 (Go 1.750のリリースノート。)
- https://go.dev/doc/go1.751 (Go 1.751のリリースノート。)
- https://go.dev/doc/go1.752 (Go 1.752のリリースノート。)
- https://go.dev/doc/go1.753 (Go 1.753のリリースノート。)
- https://go.dev/doc/go1.754 (Go 1.754のリリースノート。)
- https://go.dev/doc/go1.755 (Go 1.755のリリースノート。)
- https://go.dev/doc/go1.756 (Go 1.756のリリースノート。)
- https://go.dev/doc/go1.757 (Go 1.757のリリースノート。)
- https://go.dev/doc/go1.758 (Go 1.758のリリースノート。)
- https://go.dev/doc/go1.759 (Go 1.759のリリースノート。)
- https://go.dev/doc/go1.760 (Go 1.760のリリースノート。)
- https://go.dev/doc/go1.761 (Go 1.761のリリースノート。)
- https://go.dev/doc/go1.762 (Go 1.762のリリースノート。)
- https://go.dev/doc/go1.763 (Go 1.763のリリースノート。)
- https://go.dev/doc/go1.764 (Go 1.764のリリースノート。)
- https://go.dev/doc/go1.765 (Go 1.765のリリースノート。)
- https://go.dev/doc/go1.766 (Go 1.766のリリースノート。)
- https://go.dev/doc/go1.767 (Go 1.767のリリースノート。)
- https://go.dev/doc/go1.768 (Go 1.768のリリースノート。)
- https://go.dev/doc/go1.769 (Go 1.769のリリースノート。)
- https://go.dev/doc/go1.770 (Go 1.770のリリースノート。)
- https://go.dev/doc/go1.771 (Go 1.771のリリースノート。)
- https://go.dev/doc/go1.772 (Go 1.772のリリースノート。)
- https://go.dev/doc/go1.773 (Go 1.773のリリースノート。)
- https://go.dev/doc/go1.774 (Go 1.774のリリースノート。)
- https://go.dev/doc/go1.775 (Go 1.775のリリースノート。)
- https://go.dev/doc/go1.776 (Go 1.776のリリースノート。)
- https://go.dev/doc/go1.777 (Go 1.777のリリースノート。)
- https://go.dev/doc/go1.778 (Go 1.778のリリースノート。)
- https://go.dev/doc/go1.779 (Go 1.779のリリースノート。)
- https://go.dev/doc/go1.780 (Go 1.780のリリースノート。)
- https://go.dev/doc/go1.781 (Go 1.781のリリースノート。)
- https://go.dev/doc/go1.782 (Go 1.782のリリースノート。)
- https://go.dev/doc/go1.783 (Go 1.783のリリースノート。)
- https://go.dev/doc/go1.784 (Go 1.784のリリースノート。)
- https://go.dev/doc/go1.785 (Go 1.785のリリースノート。)
- https://go.dev/doc/go1.786 (Go 1.786のリリースノート。)
- https://go.dev/doc/go1.787 (Go 1.787のリリースノート。)
- https://go.dev/doc/go1.788 (Go 1.788のリリースノート。)
- https://go.dev/doc/go1.789 (Go 1.789のリリースノート。)
- https://go.dev/doc/go1.790 (Go 1.790のリリースノート。)
- https://go.dev/doc/go1.791 (Go 1.791のリリースノート。)
- https://go.dev/doc/go1.792 (Go 1.792のリリースノート。)
- https://go.dev/doc/go1.793 (Go 1.793のリリースノート。)
- https://go.dev/doc/go1.794 (Go 1.794のリリースノート。)
- https://go.dev/doc/go1.795 (Go 1.795のリリースノート。)
- https://go.dev/doc/go1.796 (Go 1.796のリリースノート。)
- https://go.dev/doc/go1.797 (Go 1.797のリリースノート。)
- https://go.dev/doc/go1.798 (Go 1.798のリリースノート。)
- https://go.dev/doc/go1.799 (Go 1.799のリリースノート。)
- https://go.dev/doc/go1.800 (Go 1.800のリリースノート。)
- https://go.dev/doc/go1.801 (Go 1.801のリリースノート。)
- https://go.dev/doc/go1.802 (Go 1.802のリリースノート。)
- https://go.dev/doc/go1.803 (Go 1.803のリリースノート。)
- https://go.dev/doc/go1.804 (Go 1.804のリリースノート。)
- https://go.dev/doc/go1.805 (Go 1.805のリリースノート。)
- https://go.dev/doc/go1.806 (Go 1.806のリリースノート。)
- https://go.dev/doc/go1.807 (Go 1.807のリリースノート。)
- https://go.dev/doc/go1.808 (Go 1.808のリリースノート。)
- https://go.dev/doc/go1.809 (Go 1.809のリリースノート。)
- https://go.dev/doc/go1.810 (Go 1.810のリリースノート。)
- https://go.dev/doc/go1.811 (Go 1.811のリリースノート。)
- https://go.dev/doc/go1.812 (Go 1.812のリリースノート。)
- https://go.dev/doc/go1.813 (Go 1.813のリリースノート。)
- https://go.dev/doc/go1.814 (Go 1.814のリリースノート。)
- https://go.dev/doc/go1.815 (Go 1.815のリリースノート。)
- https://go.dev/doc/go1.816 (Go 1.816のリリースノート。)
- https://go.dev/doc/go1.817 (Go 1.817のリリースノート。)
- https://go.dev/doc/go1.818 (Go 1.818のリリースノート。)
- https://go.dev/doc/go1.819 (Go 1.819のリリースノート。)
- https://go.dev/doc/go1.820 (Go 1.820のリリースノート。)
- https://go.dev/doc/go1.821 (Go 1.821のリリースノート。)
- https://go.dev/doc/go1.822 (Go 1.822のリリースノート。)
- https://go.dev/doc/go1.823 (Go 1.823のリリースノート。)
- https://go.dev/doc/go1.824 (Go 1.824のリリースノート。)
- https://go.dev/doc/go1.825 (Go 1.825のリリースノート。)
- https://go.dev/doc/go1.826 (Go 1.826のリリースノート。)
- https://go.dev/doc/go1.827 (Go 1.827のリリースノート。)
- https://go.dev/doc/go1.828 (Go 1.828のリリースノート。)
- https://go.dev/doc/go1.829 (Go 1.829のリリースノート。)
- https://go.dev/doc/go1.830 (Go 1.830のリリースノート。)
- https://go.dev/doc/go1.831 (Go 1.831のリリースノート。)
- https://go.dev/doc/go1.832 (Go 1.832のリリースノート。)
- https://go.dev/doc/go1.833 (Go 1.833のリリースノート。)
- https://go.dev/doc/go1.834 (Go 1.834のリリースノート。)
- https://go.dev/doc/go1.835 (Go 1.835のリリースノート。)
- https://go.dev/doc/go1.836 (Go 1.836のリリースノート。)
- https://go.dev/doc/go1.837 (Go 1.837のリリースノート。)
- https://go.dev/doc/go1.838 (Go 1.838のリリースノート。)
- https://go.dev/doc/go1.839 (Go 1.839のリリースノート。)
- https://go.dev/doc/go1.840 (Go 1.840のリリースノート。)
- https://go.dev/doc/go1.841 (Go 1.841のリリースノート。)
- https://go.dev/doc/go1.842 (Go 1.842のリリースノート。)
- https://go.dev/doc/go1.843 (Go 1.843のリリースノート。)
- https://go.dev/doc/go1.844 (Go 1.844のリリースノート。)
- https://go.dev/doc/go1.845 (Go 1.845のリリースノート。)
- https://go.dev/doc/go1.846 (Go 1.846のリリースノート。)
- https://go.dev/doc/go1.847 (Go 1.847のリリースノート。)
- https://go.dev/doc/go1.848 (Go 1.848のリリースノート。)
- https://go.dev/doc/go1.849 (Go 1.849のリリースノート。)
- https://go.dev/doc/go1.850 (Go 1.850のリリースノート。)
- https://go.dev/doc/go1.851 (Go 1.851のリリースノート。)
- https://go.dev/doc/go1.852 (Go 1.852のリリースノート。)
- https://go.dev/doc/go1.853 (Go 1.853のリリースノート。)
- https://go.dev/doc/go1.854 (Go 1.854のリリースノート。)
- https://go.dev/doc/go1.855 (Go 1.855のリリースノート。)
- https://go.dev/doc/go1.856 (Go 1.856のリリースノート。)
- https://go.dev/doc/go1.857 (Go 1.857のリリースノート。)
- https://go.dev/doc/go1.858 (Go 1.858のリリースノート。)
- https://go.dev/doc/go1.859 (Go 1.859のリリースノート。)
- https://go.dev/doc/go1.860 (Go 1.860のリリースノート。)
- https://go.dev/doc/go1.861 (Go 1.861のリリースノート。)
- https://go.dev/doc/go1.862 (Go 1.862のリリースノート。)
- https://go.dev/doc/go1.863 (Go 1.863のリリースノート。)
- https://go.dev/doc/go1.864 (Go 1.864のリリースノート。)
- https://go.dev/doc/go1.865 (Go 1.865のリリースノート。)
- https://go.dev/doc/go1.866 (Go 1.866のリリースノート。)
- https://go.dev/doc/go1.867 (Go 1.867のリリースノート。)
- https://go.dev/doc/go1.868 (Go 1.868のリリースノート。)
- https://go.dev/doc/go1.869 (Go 1.869のリリースノート。)
- https://go.dev/doc/go1.870 (Go 1.870のリリースノート。)
- https://go.dev/doc/go1.871 (Go 1.871のリリースノート。)
- https://go.dev/doc/go1.872 (Go 1.872のリリースノート。)
- https://go.dev/doc/go1.873 (Go 1.873のリリースノート。)
- https://go.dev/doc/go1.874 (Go 1.874のリリースノート。)
- https://go.dev/doc/go1.875 (Go 1.875のリリースノート。)
- https://go.dev/doc/go1.876 (Go 1.876のリリースノート。)
- https://go.dev/doc/go1.877 (Go 1.877のリリースノート。)
- https://go.dev/doc/go1.878 (Go 1.878のリリースノート。)
- https://go.dev/doc/go1.879 (Go 1.879のリリースノート。)
- https://go.dev/doc/go1.880 (Go 1.880のリリースノート。)
- https://go.dev/doc/go1.881 (Go 1.881のリリースノート。)
- https://go.dev/doc/go1.882 (Go 1.882のリリースノート。)
- https://go.dev/doc/go1.883 (Go 1.883のリリースノート。)
- https://go.dev/doc/go1.884 (Go 1.884のリリースノート。)
- https://go.dev/doc/go1.885 (Go 1.885のリリースノート。)
- https://go.dev/doc/go1.886 (Go 1.886のリリースノート。)
- https://go.dev/doc/go1.887 (Go 1.887のリリースノート。)
- https://go.dev/doc/go1.888 (Go 1.888のリリースノート。)
- https://go.dev/doc/go1.889 (Go 1.889のリリースノート。)
- https://go.dev/doc/go1.890 (Go 1.890のリリースノート。)
- https://go.dev/doc/go1.891 (Go 1.891のリリースノート。)
- https://go.dev/doc/go1.892 (Go 1.892のリリースノート。)
- https://go.dev/doc/go1.893 (Go 1.893のリリースノート。)
- https://go.dev/doc/go1.894 (Go 1.894のリリースノート。)
- https://go.dev/doc/go1.895 (Go 1.895のリリースノート。)
- https://go.dev/doc/go1.896 (Go 1.896のリリースノート。)
- https://go.dev/doc/go1.897 (Go 1.897のリリースノート。)
- https://go.dev/doc/go1.898 (Go 1.898のリリースノート。)
- https://go.dev/doc/go1.899 (Go 1.899のリリースノート。)
- https://go.dev/doc/go1.900 (Go 1.900のリリースノート。)
- https://go.dev/doc/go1.901 (Go 1.901のリリースノート。)
- https://go.dev/doc/go1.902 (Go 1.902のリリースノート。)
- https://go.dev/doc/go1.903 (Go 1.903のリリースノート。)
- https://go.dev/doc/go1.904 (Go 1.904のリリースノート。)
- https://go.dev/doc/go1.905 (Go 1.905のリリースノート。)
- https://go.dev/doc/go1.906 (Go 1.906のリリースノート。)
- https://go.dev/doc/go1.907 (Go 1.907のリリースノート。)
- https://go.dev/doc/go1.908 (Go 1.908のリリースノート。)
- https://go.dev/doc/go1.909 (Go 1.909のリリースノート。)
- https://go.dev/doc/go1.910 (Go 1.910のリリースノート。)
- https://go.dev/doc/go1.911 (Go 1.911のリリースノート。)
- https://go.dev/doc/go1.912 (Go 1.912のリリースノート。)
- https://go.dev/doc/go1.913 (Go 1.913のリリースノート。)
- https://go.dev/doc/go1.914 (Go 1.914のリリースノート。)
- https://go.dev/doc/go1.915 (Go 1.915のリリースノート。)
- https://go.dev/doc/go1.916 (Go 1.916のリリースノート。)
- https://go.dev/doc/go1.917 (Go 1.917のリリースノート。)
- https://go.dev/doc/go1.918 (Go 1.918のリリースノート。)
- https://go.dev/doc/go1.919 (Go 1.919のリリースノート。)
- https://go.dev/doc/go1.920 (Go 1.920のリリースノート。)
- https://go.dev/doc/go1.921 (Go 1.921のリリースノート。)
- https://go.dev/doc/go1.922 (Go 1.922のリリースノート。)
- https://go.dev/doc/go1.923 (Go 1.923のリリースノート。)
- https://go.dev/doc/go1.924 (Go 1.924のリリースノート。)
- https://go.dev/doc/go1.925 (Go 1.925のリリースノート。)
- https://go.dev/doc/go1.926 (Go 1.926のリリースノート。)
- https://go.dev/doc/go1.927 (Go 1.927のリリースノート。)
- https://go.dev/doc/go1.928 (Go 1.928のリリースノート。)
- https://go.dev/doc/go1.929 (Go 1.929のリリースノート。)
- https://go.dev/doc/go1.930 (Go 1.930のリリースノート。)
- https://go.dev/doc/go1.931 (Go 1.931のリリースノート。)
- https://go.dev/doc/go1.932 (Go 1.932のリリースノート。)
- https://go.dev/doc/go1.933 (Go 1.933のリリースノート。)
- https://go.dev/doc/go1.934 (Go 1.934のリリースノート。)
- https://go.dev/doc/go1.935 (Go 1.935のリリースノート。)
- https://go.dev/doc/go1.936 (Go 1.936のリリースノート。)
- https://go.dev/doc/go1.937 (Go 1.937のリリースノート。)
- https://go.dev/doc/go1.938 (Go 1.938のリリースノート。)
- https://go.dev/doc/go1.939 (Go 1.939のリリースノート。)
- https://go.dev/doc/go1.940 (Go 1.940のリリースノート。)
- https://go.dev/doc/go1.941 (Go 1.941のリリースノート。)
- https://go.dev/doc/go1.942 (Go 1.942のリリースノート。)
- https://go.dev/doc/go1.943 (Go 1.943のリリースノート。)
- https://go.dev/doc/go1.944 (Go 1.944のリリースノート。)
- https://go.dev/doc/go1.945 (Go 1.945のリリースノート。)
- https://go.dev/doc/go1.946 (Go 1.946のリリースノート。)
- https://go.dev/doc/go1.947 (Go 1.947のリリースノート。)
- https://go.dev/doc/go1.948 (Go 1.948のリリースノート。)
- https://go.dev/doc/go1.949 (Go 1.949のリリースノート。)
- https://go.dev/doc/go1.950 (Go 1.950のリリースノート。)
- https://go.dev/doc/go1.951 (Go 1.951のリリースノート。)
- https://go.dev/doc/go1.952 (Go 1.952のリリースノート。)
- https://go.dev/doc/go1.953 (Go 1.953のリリースノート。)
- https://go.dev/doc/go1.954 (Go 1.954のリリースノート。)
- https://go.dev/doc/go1.955 (Go 1.955のリリースノート。)
- https://go.dev/doc/go1.956 (Go 1.956のリリースノート。)
- https://go.dev/doc/go1.957 (Go 1.957のリリースノート。)
- https://go.dev/doc/go1.958 (Go 1.958のリリースノート。)
- https://go.dev/doc/go1.959 (Go 1.959のリリースノート。)
- https://go.dev/doc/go1.960 (Go 1.960のリリースノート。)
- https://go.dev/doc/go1.961 (Go 1.961のリリースノート。)
- https://go.dev/doc/go1.962 (Go 1.962のリリースノート。)
- https://go.dev/doc/go1.963 (Go 1.963のリリースノート。)
- https://go.dev/doc/go1.964 (Go 1.964のリリースノート。)
- https://go.dev/doc/go1.965 (Go 1.965のリリースノート。)
- https://go.dev/doc/go1.966 (Go 1.966のリリースノート。)
- https://go.dev/doc/go1.967 (Go 1.967のリリースノート。)
- https://go.dev/doc/go1.968 (Go 1.968のリリースノート。)
- https://go.dev/doc/go1.969 (Go 1.969のリリースノート。)
- https://go.dev/doc/go1.970 (Go 1.970のリリースノート。)
- https://go.dev/doc/go1.971 (Go 1.971のリリースノート。)
- [https://go.dev/doc/go1.972](https://go.dev/doc/