Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 11662] ファイルの概要

このコミットは、Go言語の仕様書 (doc/go_spec.html) における誤った素数の例を修正するものです。具体的には、素数のリストとして示されていた配列 primes の中に含まれていた誤った値(合成数 9 と非常に大きな数)を、より適切な素数 2147483647 に置き換えています。また、仕様書のバージョン日付も更新されています。

コミット

commit fc06cadd8865f4b6db068cbcd45b2a04e559c422
Author: Rob Pike <r@golang.org>
Date:   Tue Feb 7 06:59:36 2012 +1100

    go_spec: primality is elusive
    This time for sure.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5634046

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/fc06cadd8865f4b6db068cbcd45b2a04e559c422

元コミット内容

go_spec: primality is elusive
This time for sure.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5634046

変更の背景

このコミットの背景には、Go言語の公式仕様書に記載されていたコード例の誤りがあります。Go言語の仕様書は、言語の挙動を正確に定義するための重要なドキュメントであり、その中に含まれるコード例もまた、読者が言語の機能や構文を理解するための手助けとなります。

以前の仕様書には、素数のリストを示す primes という名前の整数型スライス(Goにおける可変長配列)の初期化例が含まれていました。しかし、このリストには数学的に誤った値が含まれていました。具体的には、9 は素数ではなく合成数であり、また 1174250539803415390440702411831137627109479 という非常に大きな数も、その素数性が不明確であるか、あるいは意図しない値であった可能性があります。

コミットメッセージの "primality is elusive"(素数性は捉えどころがない)という表現は、素数であるかどうかの判断が時に難しいこと、あるいは以前の修正試みが不十分であったことを示唆しています。このコミットは、仕様書の正確性を保ち、読者に誤解を与えないようにするために、この誤りを修正することを目的としています。

前提知識の解説

素数 (Prime Number)

素数とは、1とその数自身以外に正の約数を持たない自然数で、1より大きい数のことです。例えば、2, 3, 5, 7, 11, 13 などが素数です。

  • :
    • 2 は素数(約数は1と2のみ)
    • 4 は素数ではない(約数は1, 2, 4)
    • 9 は素数ではない(約数は1, 3, 9)

Go言語における複合リテラル (Composite Literals)

Go言語では、配列、スライス、マップ、構造体などの複合型を初期化するために「複合リテラル」を使用します。これは、型名の後に波括弧 {} で囲まれた要素のリストを記述する構文です。

  • スライスの複合リテラル例:
    // int型のスライスを初期化
    numbers := []int{1, 2, 3, 4, 5}
    
    このコミットで修正されている primes := []int{...} も、この複合リテラルの一例です。

Go言語の仕様書 (doc/go_spec.html)

Go言語の仕様書は、Go言語の構文、セマンティクス、標準ライブラリの動作などを詳細に記述した公式ドキュメントです。Go言語の設計思想や機能の根拠を理解する上で非常に重要です。このドキュメントはHTML形式で提供されており、ウェブブラウザで閲覧可能です。

技術的詳細

このコミットは、Go言語の仕様書である doc/go_spec.html ファイルに対して行われた修正です。変更点は主に以下の2点です。

  1. 仕様書の日付の更新: 仕様書のフッターに表示されるバージョン日付が、January 30, 2012 から February 6, 2012 に更新されています。これは、ドキュメントの内容が更新されたことを示す標準的な慣行です。

  2. 素数リストの修正: Go言語の複合リテラルの例として示されていた primes スライスの初期化部分が修正されました。

    • 変更前:

      primes := []int{2, 3, 5, 7, 9, 11, 13, 17, 19, 991, 1174250539803415390440702411831137627109479}
      

      このリストには、合成数である 9 が含まれていました。また、最後の 1174250539803415390440702411831137627109479 は非常に大きな数であり、その素数性が直感的に判断しにくい、あるいはGoの int 型の範囲を超える可能性のある値でした(Goの int は通常32ビットまたは64ビット)。

    • 変更後:

      primes := []int{2, 3, 5, 7, 9, 2147483647}
      

      修正後も 9 は残っていますが、リストの最後の要素が 2147483647 に変更されました。2147483647 は、2^31 - 1 であり、32ビット符号付き整数の最大値であると同時に、メルセンヌ素数(Mersenne prime)の一つでもあります(具体的には8番目のメルセンヌ素数 M89)。この変更により、リストはより簡潔になり、少なくとも最後の要素は明確な素数となりました。ただし、9 が残っている点については、このコミットの意図が「素数性の捉えどころのなさ」を示すための例として、意図的に残された可能性も考えられます。

この修正は、Go言語の仕様書という公式ドキュメントの正確性を維持し、読者が誤った情報に基づいて学習することを防ぐ上で重要です。

コアとなるコードの変更箇所

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
 <!--{\
 	\"Title\": \"The Go Programming Language Specification\",
-\t\"Subtitle\": \"Version of January 30, 2012\"\
+\t\"Subtitle\": \"Version of February 6, 2012\"\
 }-->
 
 <!--
@@ -2143,7 +2143,7 @@ Examples of valid array, slice, and map literals:\
 
 <pre>
 // list of prime numbers
-primes := []int{2, 3, 5, 7, 9, 11, 13, 17, 19, 991, 1174250539803415390440702411831137627109479}\
+primes := []int{2, 3, 5, 7, 9, 2147483647}\
 
 // vowels[ch] is true if ch is a vowel
 vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}\

コアとなるコードの解説

上記の diff は、doc/go_spec.html ファイルに対する2つの主要な変更を示しています。

  1. 仕様書の日付変更:

    -\t\"Subtitle\": \"Version of January 30, 2012\"\
    +\t\"Subtitle\": \"Version of February 6, 2012\"\
    

    この行は、Go言語仕様書のサブタイトルに含まれる日付を January 30, 2012 から February 6, 2012 へと更新しています。これは、ドキュメントの内容が更新されたことを示す一般的な慣行であり、このコミットによって仕様書が改訂されたことを明確にしています。

  2. 素数リストの修正:

    -// list of prime numbers
    -primes := []int{2, 3, 5, 7, 9, 11, 13, 17, 19, 991, 1174250539803415390440702411831137627109479}\
    +// list of prime numbers
    +primes := []int{2, 3, 5, 7, 9, 2147483647}\
    

    この部分は、Go言語の複合リテラルの例として示されていた primes スライスの初期化を修正しています。

    • 削除された行 (-): 以前の primes スライスには、9(合成数)と、非常に大きな数 1174250539803415390440702411831137627109479 が含まれていました。この大きな数は、Goの int 型の範囲を超える可能性があり、またその素数性が直感的に判断しにくいものでした。
    • 追加された行 (+): 新しい primes スライスは、2, 3, 5, 7, 9 に加えて、2147483647 を含んでいます。2147483647 は、32ビット符号付き整数の最大値であり、かつ素数(メルセンヌ素数)です。この変更により、リストはより簡潔になり、少なくとも最後の要素は明確な素数となりました。9 が残っている点については、コミットメッセージの "primality is elusive" が示唆するように、素数性の判断が難しいこと、あるいは例として意図的に残された可能性が考えられます。

この修正は、Go言語の仕様書におけるコード例の正確性を向上させ、読者がより正確な情報に基づいて学習できるようにするためのものです。

関連リンク

参考にした情報源リンク