過去の日記

2007-02-28 [長年日記]

72種類のピタゴラスの定理の証明 [etc]

Pythagorean Theorem and its many proofs

英語だからといってちゅうちょする必要はない。図、式だけ見れば分かるものは多い。

追記
98種類まで増えてた。

100万までの素数表 [etc][memo]

テキスト検索で(Firefoxなら数字を普通に入力するだけで*1)判定ができるのがよい。

http://www.h7.dion.ne.jp/~konton/sosuu.html
http://web.archive.org/web/20080617184309/http://www.h7.dion.ne.jp/~konton/sosuu.html

Boolean型のhashCode()はなぜ1231と1237か? [java][tech]

  • Boolean : このオブジェクトが true を表す場合は整数 1231、false を表す場合は整数 1237

1231と1237ってなんだろ?

lethevert is a programmer - Java : hashCodeの値

考えてみた。


まず、どちらも、わりと大きな*2素数だなぁ。


あとは、これが HashMap や HashSet で使われることを考えると……。
HashMap や HasSet ではハッシュ表の個数で剰余をとって、どこに入れるかを決めるので、ハッシュ表の数がどのように決められるか? と、その数で剰余をとった時にちゃんと散らばるか? を見ればいいのかな*3


ソースを見るとコンストラクタで initialCapacity を指定しなかった時の値は11。private メソッド rehash で capasity が伸長されると *2+1 となる。
11 から始めて 1231 までの範囲で *2+1 させていって、1231,1237 に対して剰余をとると……、

1231 % 11 = 10
1237 % 11 = 5

1231 % 23 = 12
1237 % 23 = 18

1231 % 47 = 9
1237 % 47 = 15

1231 % 95 = 91
1237 % 95 = 2

1231 % 191 = 85
1237 % 191 = 91

1231 % 383 = 82
1237 % 383 = 88

1231 % 767 = 464
1237 % 767 = 470

ちゃんと、違う値を出す。


……あれ? Java SE 5.0 で仕様が変わっているのか。
initialCapacity を指定しなかった時の値は16。指定したときはその数以上の2のべき乗を内部で計算する。
で、剰余を計算するんじゃなくて、ハッシュ表の数-1 とハッシュコードの論理積をとるんだ。実質は剰余だけど、計算は単純で高速。
これは確かめてみるまでもなくビットパターンで判断できる。
4以上の2のべき乗数に対して違う剰余を出すので、OK。
追記:かなりいいかげんなこと(悪い意味の方)を書いた。詳細な内容をトラックバックでいただいた(多謝)ので、そちらを見ていただいた方がいいかと。


  1. 2つともそれなりに大きな素数であること*4
  2. そうすると必然として最下位のビットは共通して1になるから、第2ビットが異なることが望ましいだろう

という条件を満たす数ならまぁ、大体なんでも良かったのでは?
と思った。


(追記)2008/03/25
素数と剰余が作る「衝突のない世界」が気になる人は以下のエントリも読むといいかも。

ISBN(旧)のチェックデジットと剰余の関係

子が親に見せたくないテレビ番組 [etc]

2005年7月1日朝日新聞に記事があったらしい。

1位 伊東家の食卓
2位 クイズ$ミリオネア
3位 発掘!あるある大辞典II
4位 トリビアの泉
5位 NHKニュース7
6位 いきなり!黄金伝説。
7位 ロンドンハーツ
8位 水戸黄門
9位 プロ野球中継
10位 銭形金太郎

単に「見たい番組の裏番組」が混じっている気もすごくするけど……。
これ、もっと継続してやって欲しいなぁ。

*1 私はそういう設定にしている。

*2 普段から素数を意識していないと素数か判定できなぐらいに大きな、エラトステネスのふるいでチェックするのが面倒に思うぐらいに大きな、ぐらいの意味。追記:"エラトステネスのふるい"は間違い。

*3 同じハッシュ表に入ってしまったら意味がないわけだから。

*4 共通の小さな素因数を持たなければ十分なのだろうけど……。