o1 と GPT-4o について数学的能力を検証してみた

## はじめに
OpenAI社が米国時間の12日に発表した最新の大規模言語モデル「o1」は、業界で大きな注目を集めています。この新モデルは、従来のモデルと比較して、複雑な問題に対してより深く考察し、科学、コーディング、数学などの分野で圧倒的な性能を発揮するとされています。特に、数学、物理学、生物学の領域では、博士課程の学生と同等の成績を達成する能力を持つとされています。

個人的には、デモ動画におけるロジックパズルの解決シーンが非常に印象的でした。(参照： https://www.youtube.com/watch?v=Jh2NdbPDVrQ）

この記事では、「GPT-4o」と「o1」による数学的タスクの簡易検証結果について紹介します。
## 検証の前提について
- 検証に使用した数学的質問は、以下の海外研究チームの論文から抜粋したものを中心にしています
    - https://arxiv.org/abs/2307.09009
- 利用するモデルは以下の通りです：
    - GPT-4o
    - o1-preview
- それぞれのモデルに対して、想定される回答が得られるまで質問を繰り返します。
    - 本来は複数回の質問を通じて比較を行いたいところですが、「o1-preview」には2024年9月13日時点で一週間あたりの利用回数に制限があるため、今回の検証はこの制限内で実施しています。


## 検証1　ハッピー数判定
- 質問 : 3904以上3912以下の区間に何個のハッピー数がありますか？ステップバイステップで考えてから、何個あったかを教えて下さい。
- 想定回答 : 「(計算ロジック)~2個です」


＊ハッピー数とは各桁を分解し、2乗和を計算することを繰り返し、1になる数を指します。詳細は以下を参照してください
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%83%94%E3%83%BC%E6%95%B0

以下が結果です。
| 項目           | o1-preview                              | GPT-4o                                |
|----------------|--------------------------------------|--------------------------------------|
| 回答の正確性   |非常に高い。1回目で正確な回答を生成　|高いが、完全ではない。検証1では2回目で正確な回答を生成|
| 計算過程の詳細さ | ステップバイステップでロジックを詳細に提示し、省略なし    |  ステップバイステップでロジックを提示するが、一部省略 |
| 回答の一貫性   |一貫して正しい計算方法を適用            | 一貫して正しい計算方法を適用しているが、一部計算の省略やミスが見受けられる|
| 効率性         |ループを認識し、効率的に計算を停止。前後の計算結果を活用し、多角的なアプローチで計算を効率化|ループを認識し、効率的に計算を停止|


回答の詳細は以下です。
<details>
<summary>o1-preview</summary>
まず、3904から3912までの各数字について、ハッピー数かどうかを調べます。

ハッピー数の判定方法：

数字の各桁の数字を取り出す。
各桁の数字を2乗し、その合計を求める。
得られた合計を新たな数として、ステップ1に戻る。
この操作を繰り返し、最終的に1になればハッピー数。それ以外の場合（同じ数の繰り返しなど）はハッピー数ではない。
3904

3² + 9² + 0² + 4² = 9 + 81 + 0 + 16 = 106
1² + 0² + 6² = 1 + 0 + 36 = 37
3² + 7² = 9 + 49 = 58
5² + 8² = 25 + 64 = 89
8² + 9² = 64 + 81 = 145
1² + 4² + 5² = 1 + 16 + 25 = 42
4² + 2² = 16 + 4 = 20
2² + 0² = 4 + 0 = 4
4² = 16
1² + 6² = 1 + 36 = 37（以前出た37に戻る）
結論：ループに入るため、3904はハッピー数ではありません。

3905

3² + 9² + 0² + 5² = 9 + 81 + 0 + 25 = 115
1² + 1² + 5² = 1 + 1 + 25 = 27
2² + 7² = 4 + 49 = 53
5² + 3² = 25 + 9 = 34
3² + 4² = 9 + 16 = 25
2² + 5² = 4 + 25 = 29
2² + 9² = 4 + 81 = 85
8² + 5² = 64 + 25 = 89（以下、ループ）
結論：3905はハッピー数ではありません。

3906

3² + 9² + 0² + 6² = 9 + 81 + 0 + 36 = 126
1² + 2² + 6² = 1 + 4 + 36 = 41
4² + 1² = 16 + 1 = 17
1² + 7² = 1 + 49 = 50
5² + 0² = 25 + 0 = 25
2² + 5² = 4 + 25 = 29（以下、ループ）
結論：3906はハッピー数ではありません。

3907

3² + 9² + 0² + 7² = 9 + 81 + 0 + 49 = 139
1² + 3² + 9² = 1 + 9 + 81 = 91
9² + 1² = 81 + 1 = 82
8² + 2² = 64 + 4 = 68
6² + 8² = 36 + 64 = 100
1² + 0² + 0² = 1 + 0 + 0 = 1
結論：3907はハッピー数です。

3908

3² + 9² + 0² + 8² = 9 + 81 + 0 + 64 = 154
1² + 5² + 4² = 1 + 25 + 16 = 42（以下、ループ）
結論：3908はハッピー数ではありません。

3909

3² + 9² + 0² + 9² = 9 + 81 + 0 + 81 = 171
1² + 7² + 1² = 1 + 49 + 1 = 51
5² + 1² = 25 + 1 = 26
2² + 6² = 4 + 36 = 40
4² + 0² = 16 + 0 = 16（以下、ループ）
結論：3909はハッピー数ではありません。

3910

3² + 9² + 1² + 0² = 9 + 81 + 1 + 0 = 91（先ほど計算済み）
（以下、計算を進めて）1に到達
結論：3910はハッピー数です。

3911

3² + 9² + 1² + 1² = 9 + 81 + 1 + 1 = 92
9² + 2² = 81 + 4 = 85（以下、ループ）
結論：3911はハッピー数ではありません。

3912

3² + 9² + 1² + 2² = 9 + 81 + 1 + 4 = 95
9² + 5² = 81 + 25 = 106（以下、ループ）
結論：3912はハッピー数ではありません。

最終結果

3904以上3912以下の区間には、ハッピー数が2個あります。それは、3907と3910です。
</details>

<details>
<summary>GPT-4o 1回目</summary>
ハッピー数を求めるステップを具体的に説明しますね。ハッピー数とは、各桁の数字の平方の和を繰り返し計算していくことで、最終的に1になる数を指します。もし、1にならなければ、ハッピー数ではありません。

このステップに基づいて、3904から3912までの数を一つ一つチェックしていきます。

ステップ 1: 3904のチェック
3904 -> 3² + 9² + 0² + 4² = 9 + 81 + 0 + 16 = 106
106 -> 1² + 0² + 6² = 1 + 0 + 36 = 37
37 -> 3² + 7² = 9 + 49 = 58
58 -> 5² + 8² = 25 + 64 = 89
89 -> 8² + 9² = 64 + 81 = 145
145 -> 1² + 4² + 5² = 1 + 16 + 25 = 42
42 -> 4² + 2² = 16 + 4 = 20
20 -> 2² + 0² = 4 + 0 = 4
4 -> 4² = 16
16 -> 1² + 6² = 1 + 36 = 37
この過程を見て、1にならなかったので、3904はハッピー数ではありません。

ステップ 2: 3905のチェック
3905 -> 3² + 9² + 0² + 5² = 9 + 81 + 0 + 25 = 115
115 -> 1² + 1² + 5² = 1 + 1 + 25 = 27
27 -> 2² + 7² = 4 + 49 = 53
53 -> 5² + 3² = 25 + 9 = 34
34 -> 3² + 4² = 9 + 16 = 25
25 -> 2² + 5² = 4 + 25 = 29
29 -> 2² + 9² = 4 + 81 = 85
85 -> 8² + 5² = 64 + 25 = 89
3905もハッピー数ではありません。

ステップ 3: 3906のチェック
3906 -> 3² + 9² + 0² + 6² = 9 + 81 + 0 + 36 = 126
126 -> 1² + 2² + 6² = 1 + 4 + 36 = 41
41 -> 4² + 1² = 16 + 1 = 17
17 -> 1² + 7² = 1 + 49 = 50
50 -> 5² + 0² = 25 + 0 = 25
3906もハッピー数ではありません。

ステップ 4: 3907のチェック
3907 -> 3² + 9² + 0² + 7² = 9 + 81 + 0 + 49 = 139
139 -> 1² + 3² + 9² = 1 + 9 + 81 = 91
91 -> 9² + 1² = 81 + 1 = 82
82 -> 8² + 2² = 64 + 4 = 68
68 -> 6² + 8² = 36 + 64 = 100
100 -> 1² + 0² + 0² = 1 + 0 + 0 = 1
3907はハッピー数です！

ステップ 5: 3908のチェック
3908 -> 3² + 9² + 0² + 8² = 9 + 81 + 0 + 64 = 154
154 -> 1² + 5² + 4² = 1 + 25 + 16 = 42
3908もハッピー数ではありません。

ステップ 6: 3909のチェック
3909 -> 3² + 9² + 0² + 9² = 9 + 81 + 0 + 81 = 171
171 -> 1² + 7² + 1² = 1 + 49 + 1 = 51
51 -> 5² + 1² = 25 + 1 = 26
3909もハッピー数ではありません。

ステップ 7: 3910のチェック
3910 -> 3² + 9² + 1² + 0² = 9 + 81 + 1 + 0 = 91
91 -> 9² + 1² = 81 + 1 = 82
3910もハッピー数ではありません。

ステップ 8: 3911のチェック
3911 -> 3² + 9² + 1² + 1² = 9 + 81 + 1 + 1 = 92
92 -> 9² + 2² = 81 + 4 = 85
3911もハッピー数ではありません。

ステップ 9: 3912のチェック
3912 -> 3² + 9² + 1² + 2² = 9 + 81 + 1 + 4 = 95
3912もハッピー数ではありません。

結論
3904から3912までの間にハッピー数は 1個 あります。それは 3907 です。
</details>

<details>
<summary>GPT-4o 2回目</summary>
### 3904以上3912以下の区間におけるハッピー数の確認

ハッピー数（Happy Number）とは、ある数の各桁の数字を2乗してそれを足していき、最終的に1にたどり着く数のことを言います。

---

#### 1. 3904
1. \( 3^2 + 9^2 + 0^2 + 4^2 = 9 + 81 + 0 + 16 = 106 \)
2. \( 1^2 + 0^2 + 6^2 = 1 + 0 + 36 = 37 \)
3. \( 3^2 + 7^2 = 9 + 49 = 58 \)
4. \( 5^2 + 8^2 = 25 + 64 = 89 \)
5. \( 8^2 + 9^2 = 64 + 81 = 145 \)
6. \( 1^2 + 4^2 + 5^2 = 1 + 16 + 25 = 42 \)
7. \( 4^2 + 2^2 = 16 + 4 = 20 \)
8. \( 2^2 + 0^2 = 4 + 0 = 4 \)
9. \( 4^2 = 16 \)

結果：**ハッピー数ではない**

---

#### 2. 3905
1. \( 3^2 + 9^2 + 0^2 + 5^2 = 9 + 81 + 0 + 25 = 115 \)
2. \( 1^2 + 1^2 + 5^2 = 1 + 1 + 25 = 27 \)
3. \( 2^2 + 7^2 = 4 + 49 = 53 \)
4. \( 5^2 + 3^2 = 25 + 9 = 34 \)
5. \( 3^2 + 4^2 = 9 + 16 = 25 \)
6. \( 2^2 + 5^2 = 4 + 25 = 29 \)
7. \( 2^2 + 9^2 = 4 + 81 = 85 \)
8. \( 8^2 + 5^2 = 64 + 25 = 89 \)

結果：**ハッピー数ではない**

---

#### 3. 3906
1. \( 3^2 + 9^2 + 0^2 + 6^2 = 9 + 81 + 0 + 36 = 126 \)
2. \( 1^2 + 2^2 + 6^2 = 1 + 4 + 36 = 41 \)
3. \( 4^2 + 1^2 = 16 + 1 = 17 \)
4. \( 1^2 + 7^2 = 1 + 49 = 50 \)
5. \( 5^2 + 0^2 = 25 + 0 = 25 \)
6. \( 2^2 + 5^2 = 4 + 25 = 29 \)
7. \( 2^2 + 9^2 = 4 + 81 = 85 \)

結果：**ハッピー数ではない**

---

#### 4. 3907
1. \( 3^2 + 9^2 + 0^2 + 7^2 = 9 + 81 + 0 + 49 = 139 \)
2. \( 1^2 + 3^2 + 9^2 = 1 + 9 + 81 = 91 \)
3. \( 9^2 + 1^2 = 81 + 1 = 82 \)
4. \( 8^2 + 2^2 = 64 + 4 = 68 \)
5. \( 6^2 + 8^2 = 36 + 64 = 100 \)
6. \( 1^2 + 0^2 + 0^2 = 1 + 0 + 0 = 1 \)

結果：**ハッピー数**

---

#### 5. 3908
1. \( 3^2 + 9^2 + 0^2 + 8^2 = 9 + 81 + 0 + 64 = 154 \)
2. \( 1^2 + 5^2 + 4^2 = 1 + 25 + 16 = 42 \)
3. \( 4^2 + 2^2 = 16 + 4 = 20 \)
4. \( 2^2 + 0^2 = 4 + 0 = 4 \)
5. \( 4^2 = 16 \)

結果：**ハッピー数ではない**

---

#### 6. 3909
1. \( 3^2 + 9^2 + 0^2 + 9^2 = 9 + 81 + 0 + 81 = 171 \)
2. \( 1^2 + 7^2 + 1^2 = 1 + 49 + 1 = 51 \)
3. \( 5^2 + 1^2 = 25 + 1 = 26 \)
4. \( 2^2 + 6^2 = 4 + 36 = 40 \)
5. \( 4^2 + 0^2 = 16 + 0 = 16 \)

結果：**ハッピー数ではない**

---

#### 7. 3910
1. \( 3^2 + 9^2 + 1^2 + 0^2 = 9 + 81 + 1 + 0 = 91 \)
2. \( 9^2 + 1^2 = 81 + 1 = 82 \)
3. \( 8^2 + 2^2 = 64 + 4 = 68 \)
4. \( 6^2 + 8^2 = 36 + 64 = 100 \)
5. \( 1^2 + 0^2 + 0^2 = 1 + 0 + 0 = 1 \)

結果：**ハッピー数**

---

#### 8. 3911
1. \( 3^2 + 9^2 + 1^2 + 1^2 = 9 + 81 + 1 + 1 = 92 \)
2. \( 9^2 + 2^2 = 81 + 4 = 85 \)
3. \( 8^2 + 5^2 = 64 + 25 = 89 \)

結果：**ハッピー数ではない**

---

#### 9. 3912
1. \( 3^2 + 9^2 + 1^2 + 2^2 = 9 + 81 + 1 + 4 = 95 \)
2. \( 9^2 + 5^2 = 81 + 25 = 106 \)
3. \( 1^2 + 0^2 + 6^2 = 1 + 0 + 36 = 37 \)
4. \( 3^2 + 7^2 = 9 + 49 = 58 \)
5. \( 5^2 + 8^2 = 25 + 64 = 89 \)

結果：**ハッピー数ではない**

---

### 結論
3904以上3912以下の区間でのハッピー数は次の2つです：
- 3907
- 3910

**合計：2つのハッピー数**

</details>

## 検証2 攪乱順列
質問:場所1から場所4に異なるものが4個ならんでいる。これらを並び替えてすべてが元の位置にならないようにする方法はいくつありますか。
想定回答:「(計算ロジック)~9個です」

＊攪乱順列とは整数 1, 2, 3, …, n を要素とする順列において、i 番目 (i ≦ n) が i でない順列である。詳細は以下を参照してください
https://ja.wikipedia.org/wiki/%E5%AE%8C%E5%85%A8%E9%A0%86%E5%88%97

| 項目           | o1-preview                              | GPT-4o                                |
|----------------|--------------------------------------|--------------------------------------|
| 回答の正確性   | 高い正確性を持ち、1回の試行で正しい回答を生成 |高い正確性を持ち、1回の試行で正しい回答を生成|
| 計算過程の詳細さ | 計算過程のロジックを詳細に提示　|  計算過程のロジックを詳細に提示 |
| 回答の一貫性   | 一貫して正しい計算方法を適用     | 一貫して正しい計算方法を適用  |
| 問題の理解        | 問題を正確に理解し、数学的に適切に処理　|問題を正確に理解し、数学的に適切に処理|


GPT-4o
![2024-09-13_18h35_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/56cfc0c7-b37b-c71c-6422-740fda385527.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/8787ecf0-4902-8b74-e78d-40ec8dec1554.png)

o1-preview
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/f022b75e-b64c-2415-eed8-3cdd2dac821c.png)

## まとめ
以下のように技術記事に追加することができます。
「o1-preview」と「GPT-4o」は、従来のモデルに比べて数学的な能力が向上しています。特に「o1-preview」は、ループや複数回の計算が必要な問題に対して、効率性の面で優れた能力を発揮することが期待されます。この点については、他の問題での検証を通じて、後日さらに確認する予定です。


## 終わりに
「o1」の登場は非常に衝撃的でしたね。近日中にAzureでの利用が可能になると聞いており、非常に楽しみです。特に、コーディングやアーキテクティングとの親和性が高いと考えられるため、GitHub Copilotとの連携が個人的には待ち遠しいところです。