まずは準備。
大きな十進数を二進数の文字列に変換する。十進表記のリスト(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 。