桁数の大きい数字どうしの掛け算を暗算する方法


桁数の大きい数字どうしの掛け算を暗算するにはたくさんの数字を記憶しないといけないからできないと思っている人はいないでしょうか?今回は3~4桁の数字を1つ覚えておくだけで大きい数字どうしの掛け算を暗算する方法を紹介します。筆者はこの方法で20桁×20桁の掛け算に成功しました。

はじめに

この記事で言う暗算は答え以外の数字を何も記入しないで問題を解くということです。問題文を覚えないので暗算中に問題文を見る必要があります。答えも全部は覚えないので計算した部分を出力して別の部分を計算するを繰り返します。

方法

まず3桁×3桁の掛け算で例を示します。797×853を計算します。

 

f:id:itleigns:20190905160446j:plain

 

まずは1の位と1の位を掛けます。7×3は21です。21を10で割った余りの1を答えの1の位に書きます。商の2は覚えておきます。

 

f:id:itleigns:20190905161659j:plain

 

次に10の位と1の位、1の位と10の位を掛けたものを覚えておいた2に足します。2+9×3+7×5で64となります。10で割った余りの4を10の位に書き商の6を覚えておきます。

 

f:id:itleigns:20190905162506j:plain

 

次に100の位と1の位、10の位と10の位、1の位と100の位を掛けたものを覚えておいた6に足します。6+7×3+9×5+7×8で128となります。10で割った余りの8を100の位に書き商の12を覚えておきます。

 

f:id:itleigns:20190905164801j:plain

 

次に100の位と10の位、10の位と100の位を掛けたものを覚えておいた12に足します。12+7×5+9×8で119となります。10で割った余りの9を1000の位に書き商の11を覚えておきます。

 

f:id:itleigns:20190905165407j:plain

 

最後に100の位と100の位を掛けたものを覚えておいた11に足します。11+7×8で67となります。100000の位に6を10000のくらいに7を書き終わりです。

 

              f:id:itleigns:20190905170624j:plain

 

このように797×853を計算できました。だいたいイメージはつかめましたでしょうか?疑似コードにしてみるとこのようになります。

 

入力 
a_{n-1}a_{n-2}\cdots a_1a_0
b_{m-1}b_{m-2}\cdots b_1b_0
出力
a_{n-1}a_{n-2}\cdots a_1a_0 \times b_{m-1}b_{m-2}\cdots b_1b_0
アルゴリズム
 S := 0
 for \ \ i = 0\cdots n+m-2
    for \ \ j = max(0,i-m+1)\cdots min(i,n-1)
       S \ := \ S \ + \ a_j \times b_{i-j}
       print \ S \ \% \ 10
       S \ := \ S \ / \ 10
 while \ \ S \ \neq \ 0
   print \ S \ \% \ 10
    S \ := \ S \ / \ 10

 

これは下の桁から順番に出力するアルゴリズムですが正しい答えを出力します。

 

アルゴリズムの考察

 

この計算方法を使うと大きな数どうしの掛け算を暗算することが現実的になります。しかし上の疑似コードでの Sが大きな数になりすぎると難しいでしょう。この Sがどのくらいの値まで大きくなるか解析しましょう。上の疑似コードで i=p Sに足される数を S_pとすると

 \displaystyle S_p = \sum_{j=max(0,p-m+1)}^{min(p,n-1)} a_jb_{p-j} \leq 81min(n,m)

です。より i=pでの計算が終わった時の Sの値は

 \displaystyle \sum_{i=0}^p 10^{-p+i}S_p \leq \sum_{i=0}^p10^{-p+i}\cdot 81min(n,m)\leq 90min(n,m)

 です。より100桁×100桁の掛け算までは4桁の数字を1つ覚えておくだけでできます。

 

おまけ

 

実際にこの方法で20桁×20桁の掛け算をやってみた動画です。

youtu.be

 (2020-6-7追記)

この方法は海外では有名でCriss-Cross Methodと呼ばれているそうです。

Criss-Cross Method of Multiplication

割り算もやってみました。

桁数の大きい数字どうしの割り算を暗算する方法 - itleigns’s diary