作者: Tsutomu Hiroshima
日時: 2002/6/24(16:07)
日本対ドイツのカードがあったとしても,
ドイツを応援していた廣島です.

> もっと簡潔なアルゴリズムがあることに気づきました.
> と,言うか,全く初歩的なミスを犯していたのでした.

簡潔にしてみると,全く同じアルゴリズムで,
次のことができることに気づきました.

奇数に適当な数を掛けると 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 〜