第18講 n進数演算−−−加法
第10話 足し算マクロ解説その4
03154
を実現するプログラム主要部分再掲
Sub s(a() As Integer, b() As Integer, c() As Integer, n As Integer)
  
  Dim i As Integer, ik1 As Integer, ik2 As Integer, mx As Integer
  
  i = 0
  Do While 1
    If a(i) = n Then
      a(i) = 0
      ik1 = i
      Exit Do
    Ena If
    i = i + 1
  Loop
  i = 0
  Do While 1
    If b(i) = n Then
      b(i) = 0
      ik2 = i
      Exit Do
    Ena If
    i = i + 1
  Loop
  mx = ik1
  If mx < ik2 Then mx = ik2
  For i = 0 To mx - 1
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
  Next
  If c(mx) = 0 Then
    c(mx) = n
  Else
    c(mx + 1) = n
  Ena If

  For i = 0 To mx
    If c(i) < n Then Cells(6, 1 + mx - i) = c(i)
  Next
  a(ik1) = n
  b(ik2) = n

Ena Sub
参考ダウンロード添付ファイル

最後
  For i = 0 To mx - 1
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
  Next
でトレースしてみましょう。
03699
i = 0 のとき、
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
から
    c(0) = c(0) + a(0) + b(0)
    c(0 + 1) = c(0 + 1) + Int(c(0) / 6)
    c(0) = c(0) Mod 6
すなわち、
    c(0) = 0 + 3 + 0
    c(1) = 0 + Int(3 / 6)
    c(0) = 3 Mod 6
によって、
    c(0) = 3
    c(1) = 0
03699
と正しく計算できています。
i = 1 のとき、
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
から
    c(1) = c(1) + a(1) + b(1)
    c(1 + 1) = c(1 + 1) + Int(c(1) / 6)
    c(1) = c(1) Mod 6
すなわち、
    c(1) = 0 + 3 + 2
    c(2) = 0 + Int(5 / 6)
    c(1) = 5 Mod 6
によって、
    c(0) = 5
    c(1) = 0
03699
と今回も正しく計算できています。
i = 2 のとき、
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
から
    c(2) = c(2) + a(2) + b(2)
    c(2 + 1) = c(2 + 1) + Int(c(2) / 6)
    c(2) = c(2) Mod 6
すなわち、
    c(2) = 0 + 1 + 5
    c(3) = 0 + Int(6 / 6)
    c(2) = 6 Mod 6
によって、
    c(2) = 0
    c(3) = 1
03699
と繰り上がりが上手くいっています。
i = 3 のとき、
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
から
    c(3) = c(3) + a(3) + b(3)
    c(3 + 1) = c(3 + 1) + Int(c(3) / 6)
    c(3) = c(3) Mod 6
すなわち、
    c(3) = 1 + 1 + 4
    c(4) = 0 + Int(6 / 6)
    c(3) = 6 Mod 6
によって、
    c(3) = 0
    c(4) = 1
03699
と今回も正しく計算できています。
i = 4 のとき、
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
から
    c(4) = c(4) + a(4) + b(4)
    c(4 + 1) = c(4 + 1) + Int(c(4) / 6)
    c(4) = c(4) Mod 6
すなわち、
    c(4) = 1 + 4 + 2
    c(5) = 0 + Int(7 / 6)
    c(4) = 7 Mod 6
によって、
    c(4) = 1
    c(5) = 1
03699
と今回も正しく計算できています。
以下はご自分でトレースして下さい。
トレースしてみて、
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n

    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = Int(c(i) / n)
    c(i) = c(i) Mod n
で十分であることに気がつきました。
参考ダウンロード添付ファイル
プログラミングってやはり難しいですね。

さて、これで加法は終わりにします。
第19講では、n進数演算を一端休憩して、
第9講第10話で完成させた
 魔方陣自動生成ソフト添付ファイル
を改良して5次魔方陣まで自動生成できるようにしていきます。
次講で扱う手法を、私は対角線法と名付けています。
魔方陣自動生成ソフトは、さらに、
末項確定法
特殊種法
かけ算的手法
足し算的手法
一般種法
一般種法×末項確定法
中抜き法
魔方陣の法則偶数版
細胞構成法
行列交換法
(すべて私の命名法であり、細胞構成法を除いて私のアイデアです。
細胞構成法はネットを参照させて頂きました。)
などと高速化されていきます。
細胞構成法の段階で、
26次魔方陣が1秒に数百の単位で生成されます。
 第19講の魔方陣自動生成ソフト添付ファイル
では、スパコンを使ってさえ、6次でさえまったく歯が立たないのに、
細胞構成法などでは、
パソコンで26次魔方陣が1秒で数百の単位で生成されるのです。
また、足し算的手法や魔方陣の法則偶数版等を利用すれば、
500次魔方陣でも簡単に生成できます。
プログラム=プログラミングの良し悪しがすべてであることが分かります。
ハードよりソフトの方が勝負を決めるということです。

本サイトは、実は魔方陣の研究から始まりました。
今では多い日には、1日に2万のアクセスを数えるようになったこのサイトは、
魔方陣の研究から始まったのです。
『魔方陣』の検索でGoogleでトップに登り詰めても、
せいぜい数十だった1日のアクセス数が、平日なら少ない日で6千、
多い日には2万を数えるようになるとは、
夢にも思っていませんでした。
爆発的にアクセス数が伸びるようになったのは、
魔方陣を中心的な題材とするプログラミング講義を始めてからです。
今では、すっかり研究をやめてしまっていますが、
魔方陣の研究が数独自動生成アプリの開発に直接に役に立ち、
魔方陣を主な題材とする各種プログラミング講義によって、
新聞に取り上げられるまでのサイトに成長してきたのですから、
魔方陣には大変感謝しております。
『魔方陣なんてやって何になるの?』
生徒等からよくされた質問です。
私は生徒によく
『実学はもっとも役に立たない学問で、
基礎学こそがもっとも有用な学問である』
といいます。
残念ながら、人工知能が最初に奪う職種は、
実学を直接使う職域です。
基礎学を学ぶ者が、時代の勝者になるのは間違いありません。
私の長女が東北大学で哲学を専攻していますが、
我が家で哲学を専攻することに賛成した者は、
私1人です。
賛成しただけでなく、無性に嬉しかったのです。
娘と哲学の話が出来る!
哲学を語るだけで、変人と思われてしまう世の中です。
哲学を語れる機会は、本当に少ないといわなければなりません。

文部科学省が打つ出した文系学部を実学に変更し、
職業訓練校のようにせよという通達は、
まさに愚の骨頂です。
哲学・社会科学・文学・言語学など、
一見役に立たなそうな学問こそが、
重要な学問なのです。
私は、国粋主義者とは正反対のインターナショナリストですが、
国の発展を願うなら、
哲学などの基礎学を重視すべきです。
数学やプログラミングももちろんです。
文科省でただ1つ褒められるのは、
プログラミングを小学生の必須にしたことです。
人工知能の時代−−−ますますプログラミングの重要性が増していきます。

ごめんなさい。脱線が長すぎですね。
一見役に立たなそうな研究が、
時代を変えたりする・・・
これが私のいいたいことです。



第9話へ 第19講第1話へ
004

eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ