日本対ドイツのカードがあったとしても,
ドイツを応援していた廣島です.
> もっと簡潔なアルゴリズムがあることに気づきました.
> と,言うか,全く初歩的なミスを犯していたのでした.
簡潔にしてみると,全く同じアルゴリズムで,
次のことができることに気づきました.
奇数に適当な数を掛けると 16 進数表示で全ての桁に F が並びます.
1 * 15 ==> 0xf
3 * 5 ==> 0xf
5 * 3 ==> 0xf
7 * 585 ==> 0xfff
9 * 455 ==> 0xfff
11 * 95325 ==> 0xfffff
13 * 315 ==> 0xfff
(中略)
85 * 3 ==> 0xff
87 * 3085465 ==> 0xfffffff
89 * 197665011735 ==> 0xfffffffffff
91 * 45 ==> 0xfff
93 * 11275 ==> 0xfffff
95 * 723362913 ==> 0xfffffffff
97 * 2901803883615 ==> 0xffffffffffff
99 * 11645671763705525 ==> 0xfffffffffffffff
同じアルゴリズムなので Scheme 版のみ.
;; 引数 x に対して,16 進数表記で x * b = 0xff..ff となる
;; 最小の b と 0xff..ff の桁数 c のリストを返す.
;; (f 99) ==> (11645671763705525 15)
(define (f x)
(and (integer? x)
(positive? x)
(odd? x)
(let loop ((a (remainder 15 x)) (b (quotient 15 x)) (c 1))
(if (zero? a)
(list b c)
(let ((s (+ (* a 16) 15)))
(loop (remainder s x) (+ (* b 16) (quotient s x)) (+ c 1)))))))
;; 以下の do ループは結果チェック用
(do ((i 1 (+ i 2))) ((> i 100))
(let ((y (f i)))
(if y (let ((b (car y)))
(display i)
(display " * ")
(display b)
(display " ==> 0x")
(display (number->string (* i b) 16))
(newline)))))
数値を変えれば,すべてを D にもできるのだ!!!
1 * 13 ==> 0xd
3 * 1183 ==> 0xddd
5 * 181753 ==> 0xddddd
7 * 507 ==> 0xddd
9 * 6617431093 ==> 0xddddddddd
(中略)
99 * 13415785879634043877884519429598666253901419924839615 ==> 0xddddddddddddddddddddddddddddddddddddddddddddd
だから,がんばれ,Deutschland !!!
-----------------------------
廣島 勉
(tsutomu@...)
♪♪ Einigkeit und Recht und Freiheit
♪♪ Fuer das deutsche Vaterland 〜