マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第12章 while文
第7話 1!から9!まで求めるプログラム



1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
プロジェクト終了

を実現するコード例

#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

int main() {//私は社長だ。

        size_t i = 1;//階乗の始まりを指定

        size_t c;//iをコピーするための変数

        while (i < 10) {

                c = i;//iをコピーしておく

                size_t s = 1;//階乗を収納する変数

                while (i > 0) {

                        s *= i;

                        i--;

                }

                cout << c << "! = " << s << endl;

                i = c;

                i++;

        }

        cout << "プロジェクト終了" << endl;

        while (!_kbhit());//待機させるための命令

        return 0;//int main() を終わるためのお呪い

}

while (i < 10) をwhile (i < 15)と変更すると


1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
プロジェクト終了

となります。

するとwhile (i < 20)等と変更したくなるでしょうが、

これはやめた方がよいでしょう。

計算に時間がかかるからです。

19!ぐらいまでは何とか計算できるかもしれませんが、

予想より時間がかかります。

そして、size_t型

(int型と同じ整数型ですが、size_t型の方が計算が速いので魔方陣の自動生成を高速化するためにこちらを採用してきました)

の限界を超えてエラーしてしまう可能性もあります。

そして、50!になるとスーパーコンピュータ使ってもおそらく計算できないです。

階乗というのは急速に大きくなっていくのです。

計算量が急激に増えてコンピュータが手に負えなくなる現象を計算爆発と呼びますが、

運輸の最適化問題・金融の最適化問題も計算爆発を起こしてスパコンでも手に負えなくなってしまうのです。

運輸の最適化問題とは混雑状況や道のりなどから、最もコストの安い道順を決める課題ですが、

都市の数が10個程度なら何とかなりますが、

都市の数は50を超えますからスパコンでも手に負えないわけです。



本来は第10章第9話コードをwhile文に書き換えるという課題を出したいところですが、

コードが複雑になりすぎますので、その課題はやめることにします。

ただ、意欲がある方は是非取り組んでみてください。

第12章は以上にしまして、本講義の最終章である第13章に進みたいと思います。

第13章では奇数次魔方陣・構造解析型(名称はより簡単なものに変更予定)による6次魔方陣の高速化・特殊種法・一般種法等を研究していきます。

前にも一度予告しましたが、最後の一般種法を使うと6次魔方陣が平均0.06秒台で自動生成できます。

そして、私の人生で初めての取り組みになりますが、

第13章で扱うテーマを中心とする学術論文を執筆する作業に入ります。

論文では偶数次魔方陣の一般的作成方法を2つ扱います。

そのうちの一つ目はこの講義の第6章で紹介した魔方陣の作成方法です。

奇数次魔方陣については一般的作成方法は、知られていましたが偶数次の場合には一般的作成方法は知られていませんでした。

そして、2つ目は私が足し算的手法と呼ぶものです。

4次魔方陣と6次魔方陣を作っておくと

4,8,12,16,・・・

6,10,14,18,・・・

次魔方陣を作成するできます。

8次は4次魔方陣を2つ合体して作ります。

12次は3つ合体して作れます。

16次は4つ合体して作れます。

足し算的手法という名称の理由は

8 = 4 + 4、12 = 4 + 4 + 4、16 =  4 + 4 + 4 + 4、・・・

10 = 4 + 6、14 = 4 + 4 + 6、18 = 4 + 4 + 4 + 6、・・・

であるからです。

4次魔方陣と10次魔方陣を合体させれば14次魔方陣が作れます。

これに気づいたのは運転中に車を上から見た図が浮かんできたからです。

その抽象的な図を見た瞬間に20次以下では唯一
落城していなかった14次魔方陣の落城を確信するとともに、

足し算的手法を直観しました。

こうして30年前に偶数次魔方陣の一般的作成方法の一つ目を発見したのです。

第6章で紹介した方法は、今から23年前に栃木県の県立高校で出題されたカレンダーの不思議という出題をみて思いつきました。

私は栃木県の県立高校の数学科教諭・情報科教諭をしていました。

その入試問題を採点しているときに第6章で紹介した方法を思いついたのです。

本サイトでもカレンダーの不思議は

http://suugaku.biz/mahouhinn/karennda-.htm

で扱っています。







第12章第6話へ 第13章1話へ

本講義トップへ