天文学的数

http://www2d.biglobe.ne.jp/~st886ngw/hasegawa/cd-ver2.htmより抜粋

出版者記号の範囲  書名記号の総数

00−19       1000000
200−699      100000
7000−8499     10000
85000−89999    1000
900000−949999   100
9500000−9999999  10

この出版社記号の部分をPerlで表記するとこんな感じ。

@publisher_code = ();
push @publisher_code,(00..19);
push @publisher_code,(200..699);
push @publisher_code,(7000..8499);
push @publisher_code,(85000..89999);
push @publisher_code,(900000..949999);
push @publisher_code,(9500000..9999999);

で、実際に理論上どれだけ存在できるかを確認してみた。

A B 含まれる数
00 19 20
200 699 500
7000 8499 1,500
85000 89999 5,000
900000 949999 50,000
9500000 9999999 500,000
合計 557,020

ごじゅうごまんななせんにじゅう。
ISBNが10桁から13桁に移行したのは、この出版社記号が(一部の国で)枯渇し始めたからだと言うけれど、どんだけ出版社作ってるねん米国と英国! 0と1合わせて百十万以上の出版社が作れるねんで、それすら足りないとかどうなっとんねん。まあ、英語の本やったらなんでもええみたいやけどそれさっぴいても作りすぎやろう。ドメインみたいに「とりあえず出版社記号取ってそれから考える」とかやってんじゃなかろうな。
んでまあ、もし完全なISBN業者のリストを作ることを考えるとすると、時間をかけて有効な出版社コードをしらみつぶしにしていくのが基本になるかなあ。
で、あらかじめ有効な出版社コードをリストにしていくことを考えると、やっとれるかバーローと言う結論になる。
そこで次善の策は、有効な出版社コードを入れると、一つ上の有効な出版社コードを返す関数を作成することだろうな。

sub next_publisher_code {
	my $now = shift;
	$now or return '00';
	my $next = $now;
	$next += 1;
	$next == 20 and $next *= 10;
	$next == 700 and $next *= 10;
	$next == 8500 and $next *= 10;
	$next == 90000 and $next *= 10;
	$next == 950000 and $next *= 10;
	$next == 10000000 and return '';
	return sprintf "%02d", $next;
}

まあ、負荷を考えて10分に一回のペースで検索していくとして、5,500,000分=3,819日=約10年と半年の時間が必要になる。これこそやっとれるかバーローである。
実際にはそれぞれのグループの最後の方は未登録の領域がずっと続いているんだろうから、一度未登録が出たらそのグループを卒業すると言うやり方と、必要な時に取りに行くのを併用するのがベストかも知れないが。