RPG

434. [解答] コラッツの予想を実証するRPGプログラム

コラッツの予想とは

任意の自然数 N に対して

(1) N が偶数であれば M = N/2 を算出する
(2) N が奇数であれば M = 3N + 1 を算出する

として次の N = M としてこの演算を繰り返していけば M は必ず 1 に帰結する
というのがコラッツの予想であった。
_

これをRPGプログラムで書くと次のとおり。

[RPG : TESTCRT ]

ソースはこちらから

0001.00 H DFTNAME(TESTCRT) DATEDIT(*YMD/) BNDDIR('QC2LE')                                   
0002.00 F********** コラッツの予想 ********************************************             
0003.00 F*                                                                                  
0004.00 F**********************************************************************             
0005.00                                                                                     
0006.00  * CRTRPGMOD  OBJ(QTEMP/TESTCRT)  SRCFILE(R610SRC/QRPGLESRC)                        
0007.00  * DBGVIEW(*SOURCE) AUT(*ALL)                                                       
0008.00  * CRTPGM PGM(ASNET.COM/TESTCRT) MODULE(QTEMP/TESTCRT) ACTGRP(*NEW)                 
0009.00  *        AUT(*ALL)                                                                 
0010.00                                                                                     
0011.00  *-------------------------------------------------------------------*              
0012.00  *  2023/03/11 : 作成                                                               
0013.00  *-------------------------------------------------------------------*              
0014.00  *( 作業変数 )                                                                      
0015.00 D N               S              4S 0                                               
0016.00 D M               S              4S 0                                               
0017.00 D AMARI           S              4S 0                                               
0018.00                                                                                     
0019.00 C     ' 自然数 ?'   DSPLY                   NSU              10                     
0020.00  *( コンラッツ予想を計算 )                                                          
0021.00 C                   EVAL      N = %DEC(NSU:4:0)                                     
0022.00 C                   IF        N > 0                                                 
0023.00 C                   DO        *HIVAL                                       DO-*HIVAL
0024.00 C     N             DIV       2             M                                        
0025.00 C                   MVR                     AMARI                    50              
0026.00 C                   IF        *IN50 = *ON                                   偶数     
0027.00 C                   EVAL      N = M                                                  
0028.00 C                   ELSE                                                    奇数     
0029.00 C                   EVAL      N = N * 3 + 1                                          
0030.00 C                   ENDIF                                                            
0031.00  *( 結果を表示 )                                                                     
0032.00 C                   EVAL      NSU = 'N = ' + %CHAR(N)                                
0033.00 C                   IF        N = 1                                        N = 1     
0034.00 C     NSU           DSPLY                   ANS               2                      
0035.00 C                   LEAVE                                                            
0036.00 C                   ELSE                                                             
0037.00 C     NSU           DSPLY                                                            
0038.00 C                   ENDIF                                                  N = 1     
0039.00 C                   ENDDO                                                  DO-*HIVAL 
0040.00 C                   ENDIF                                                            
0041.00 C                   SETON                                        LR                  
0042.00 C                   RETURN                                                           


                                                      

[コンパイル]

CRTBNDRPG PGM(OBJLIB/TESTCRT) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)

[実行]

 DSPLY   自然数 ? 
 7
DSPLY  N = 22  
DSPLY  N = 11  
DSPLY  N = 34  
DSPLY  N = 17  
DSPLY  N = 52  
DSPLY  N = 26  
DSPLY  N = 13  
DSPLY  N = 40  
DSPLY  N = 20  
DSPLY  N = 10  
DSPLY  N = 5   
DSPLY  N = 16 
DSPLY  N = 8  
DSPLY  N = 4  
DSPLY  N = 2  
DSPLY  N = 1      

[解説]

任意の自然数に何を指定しても N = 1と表示されて終了することがわかる。
これを数学的に証明することが問題である。
プログラムとしてはやさしく作成できたはずである。解答は計算のプロセスも表示できるようにしてある。
 
ところでこれを見てお気づきのように
最後のほうでN = 16 となれば N= 8, 4, 2, 1 と
限りなく 1に収束していることがわかる。
つまり
任意の奇数 N に対して 3N + 1 が 8ヤ16 のような 2の累乗になったときは
1に収束するのである。
このことを証明すればコンラッツの予想は証明できたことになる。

また面白いことにRPGにしておくと 3N + 1 ではなく 3N + 2 にしてみる
実験もRPGのソースを修正するだけで簡単に試すことができる。
もちろん 3N + 2 では途中から N が大きくなりすぎて
収束することはできない。やはり 3N + 1 においてのみ成り立つと
言えそうである。
このように数学もプログラムで試行することができる。
フェルマーの最終定理もRPGで試行することができるかも知れない。

RPGでこんなにも簡単に実証プログラムを作れるのだから
証明も何とかできるような気もするが。