fortran66のブログ

fortran について書きます。

まずは準備。
大きな十進数を二進数の文字列に変換する。十進表記のリスト(1654 桁の数)をファイルから読み込み、まずそれを一桁づつ整数配列に入れる。次にそれを二進数に直して下の桁が先に来る逆順の文字列にする。


ロジャー・ペンローズ著『皇帝の新しい心』第二章の万能チューリング機械のチューリング数の十進数*1を二進数に変換するプログラム。



MODULE m_subs
CONTAINS
!-------------------------------------------
SUBROUTINE to_int(ir, k10, ipos)
IMPLICIT NONE
INTEGER, INTENT(IN)  :: ir
INTEGER, INTENT(OUT) :: k10(:)
INTEGER, INTENT(INOUT) :: ipos
CHARACTER (LEN = 132) :: text
INTEGER :: i, io
DO 
 READ(10, '(a)', IOSTAT = io) text
 IF (io == -1) EXIT ! EOF
 DO  i = 1, LEN(text)
  IF (text(i:i) == ' ') CYCLE ! skip SPACE
  ipos = ipos + 1
  READ(text(i:i), '(i1)') k10(ipos)
 END DO
END DO
RETURN
END SUBROUTINE to_int
!-------------------------------------------
SUBROUTINE to_bin(k10, k02)
IMPLICIT NONE
INTEGER, INTENT(INOUT) :: k10(:)
CHARACTER (LEN = *), INTENT(OUT) :: k02
INTEGER :: i, j, k, ic, m, n
k = SIZE(k10)
j = 0
DO 
 j = j + 1
 WRITE(k02(j:j), '(i1)') MOD(k10(k), 2)
 ic = 0
 DO i = 1, k
  m = 10 * ic + k10(i)
  k10(i) = m / 2
  ic = MOD(m, 2) ! carry
 END DO    
 IF (COUNT(k10 /= 0) == 0) EXIT
END DO
RETURN
END SUBROUTINE to_bin
!-------------------------------------------
END MODULE m_subs
!===========================================
PROGRAM decbin
USE m_subs
IMPLICIT NONE
INTEGER, PARAMETER :: n10 = 2000, n02 = 10000
INTEGER :: k10(n10), max10 = 0, i
CHARACTER (LEN = n02) :: k02 = ''
OPEN (10, file = 'TURING10.LST')
CALL to_int(10, k10, max10)
PRINT *, 'max10 =', max10
PRINT '(100i1)', k10(:max10)
CALL to_bin(k10(:max10), k02)
PRINT *, 'max02 =', LEN_TRIM(k02)
PRINT '(78a1)', (k02(i:i), i = LEN_TRIM(k02), 1, -1)
STOP
END PROGRAM decbin

あまりよく考えなかったw 配列はみだしなどの自己エラーチェックなし。

十進リスト。改行などは日本語訳本にあわせた。

TURING10.LST

    7244855335339317577198395039615711237952360672556559631108144796606505
05940424109031048361363235936564444345838222688327876762655614469281411771
50178425517075540856576897533463569424784885970469347257399885822838277952
94683460521061169835945938791885546326440925525505820555989451890716537414
89603309675302043155362503498452983232065158304766414213070881932971723415
10569802627346864299218381721573334828230734537134214750597403451843723595
93090640024321077342178851492760797597634415123079586396354492269159479654
61471134570014504816733756217257346452273105448298078496512698878896456976
09066342044779890219144379328300194935709639217039048332708825962013017737
27202718625919914428275437422351355675134084222299889374410534305471044368
69587640517812801943753081387063994277282315642528923751456544389905278079
32411448261423572861931183326106561227555318102075110853376338060310823616
75045635852164214869542347187426437544428790062485827091240422076538754264
45413345174856629157429990950262300973373813772416217274772361020678685400
28935660856968226201419824862169890260913094029857060017430067008689675903
44734174127874255812015493663938996905817738591654055356704092821332221631
41097871081459978669599704509681841906299443656015145490488092208448003482
24920773040304318842989939313526688234966210194716191070146196852319284748
20344958977095535611070275817487333272966789987984732840981907648512726310
01740166787363477605857245036964434897992034489997455662402937487668839751
40445166570775006051388399166881407254554466522205072426239237921152531816
25125363050931728631422004064571305275802307665183351995689139748137504926
429605010013651980186945639498

二進リスト

100000000101110100110100010010101011010001101000101000001101010011010001010100
101101000011010001010010101101001001110100101001001011101010001110101010010010
101110101010011010001010001010110100000110100100000101011010001001110100101000
010101110100100011101001010100001011101001010011010000100001110101000011101010
000100100111010001010101101010010101101000001101010100101101001001000110100000
000110100000011101010010101010111010000100111010010101010101010111010000101010
111010000101000101110100010100110100100001010011010010100100110100100010110101
000101110100100101011101001010001110101001010010011101010101000011010010101010
111010100100010110101000010110101000100110101010101000101101001010100100101101
010010010111010101001010111010100101001101010100001110100010010010101110101010
010101110101010000011101010010000011010101010010111010100101011010001001000111
010000000111010010100101010101110100101001001010111010000010101110100001000111
010000010101001110100001010011101000001000101110100010000111010000100101001110
100010000101101000101001011101000101001011010010000010110100010101001001101000
101010101110100100000111010010010101010111010101010011010010001010110100100100
101101000000010110100000100011010000010010110100000000011010010100010111010010
101000110100101001010110100000100111010010101001011010010011101010000001010111
010100000011010101000101010110100101010110101000010101110101001001010111010100
010010110101001000010111010000001110101001000101101010010100110101010001011101
010010100101110101010000010111010101000001011101000000111010101000010101110100
101010110101010000101110101000101010111010101001001011101010101000011101010000
000111010010010000110100100100010110101010101001110100000000101101001000011010
101010100101110100100001101001000101010111010000100011101000100001110100001101
000000010110100000100101110101010010101011010001000100101110100000100111010101
001101000001010101101000010000111010010000100011101010101010100111010000100100
111010001001000011101000010100101101000010100001110101010101010111010001001001
101000100100110101001010010111010001000101011101000000011101000100100101110100
110100100100001011010101010011010001010001011101000011010100001000101101010011
010101001010010110101010011010010010101110100110100100000101101000101010100011
101001000010101101000000100110100100010010111010010000110101000001001011101001
001010011010010010101011010011010010010100101101001101001010000010110100100000
111010100100110101010100001011101001010000101110100101010101110101000100101101
001001110100101010001011101000100111010100001011010010011101001010101010111010
010001110100101010100101110100100011101010000010101011100110101000001011010010
011101010000001011101001011010100000101011010010100101110101000010010111010000
110101000100001011010100110101000100010110101010100101110101000101001011010001
010101011101001000010101101010001011101010010010101011101010100100101110101000
111010100011101010010010010111010100011101010010100010111010100010111010100001
001011101010001110100010100010111010010100101110101001010100101110100101010101
010110101000010101010110100001001110100001010101010111010101000101011101010100
010101110100000011101010100010010111010000001110101010010001011101010000001101
010000101101000000111010010000001011101010001110101001000101011101010011010101
010001010110100000110101010100101010110100000010011010101010010011101010011010
101010010010110101001101001001001110100000110101010101001010110101000100110100
010100101010111010000011010101010101001011010001000111010001010101010101101000
100011101000010101110100010010000111010011010000000100111010000001001011101000
100010100111010000001001011101001010101010010110100001010101011101000100101001
011101000001000101110101010010110100010001001110100000100101011101000000101010
110100001000111001111010000100000111010000100100111010000010100101110100000101
001011010000100010101110100001000100110100010000111010111101000010010010111010
000100100101110100000001010111010000101010001101000100101110100001000001110100
001001110100010000010111010101001011010001000001011101000010101010111010000001
010101110100010000101011101000100001010111010010000011101010010010011010000001
010111010001000100101110101010000111010100101011010010101010000110100000101001
101000000011101000001001001110100101101001000101001011010101001101000101001001
011010101001101000101010001011001101010010010111010101001101000101010101011001
101010001010101100110100100010101010111010001000111010010010101010101101001010
010100011010010000001011101000001101010100101010101101001010101101001000100010
111010001010101101010000010101101000100000110100100010101101000010011101010010
101010101110100101101001001000101011001101001001001010101110100110100100100101
011010010110100100100100101101001011010010010100010110011010010010100101011101
000101011101001001011100110100100101010010111001101001010001010101110100010001
110100001010010110100101000101110100101000101011010001001110100101000100101110
100010011101001010010001011100110100100010001110100010011101001010010101011100
110100101000001110011010101010101101000000011101001010100101010111010010001110
100101010010101110011010000101001001100110101000001101000000011101001010101001
010111001101010001000011010000000111010001001010101011101000100011101010101010
101010110100001001110100100010010101110100101010001001101010000000101101001001
110101000010101110100100001101010000000101101001000111010100100101110100001101
010000101010110101000101110101000010100101110101000101110101000101010101110011
01010001010110100001101010001001010

*1:日本語訳初版の十進数リストは一文字間違っている。二行目 39 番目の文字は 9 ではなく 8 。