FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

魔円陣

 雑誌『数学セミナー』(日本評論社)の二〇一三年七月号を読んでいたら、「魔円陣」という言葉が出てきた(秋山 茂樹『魔円陣と有限幾何』)。うちらが「完全ゴロム環」と呼んでいるものと同じだった。そうしたら、同じく『数学セミナー』の一九八七年七月号(四半世紀以上も前だ)で、下林山 稔(しもばやしやま みのる)さんという方が魔円陣を14まで計算していたことがわかった(『パソコンで魔円陣を』)。BASICで9まで計算し、その後アセンブラで試みて14まで行ったそうである。くそぅ、先を越されてたか。

 ともあれ「魔方陣」(「魔法陣」ではない)は「足したときに同じ数が出る」のだから「魔円陣」という名前はどうなんだろうとは思った。ぜんぶ違う数でぜんぶ違う数が和として出るのはいいのか。命名者は岩掘 長慶先生か島内 剛一先生だろうと思うが、英語では Magic Circles であるらしい。
 なお、別名を「ビリヤード球の問題」といい、こちらは 森 博嗣さんの『笑わない数学者』という小説の中に出てきた。
 「完全ゴロム環」という名前はゴロム定規から取ったもので、魔円陣を切りひらいて無限個並べると、任意の整数が目盛の間隔として出るということで「定規」の一種という扱いにしている。こういう観点からすると乱数との関連もあるかもしれない。

 『パソコンで魔円陣を』は読んだはずなのだが、「魔円陣」を「魔方陣」と間違えたらすくスルーしていたらしい。しかもこれまたフローチャートが痛々しいので目が拒否したかもしれない。ええ、私は Java で書いてますから GOTO は不使用です。

 Java を覚えたての頃に書いたのでなかなかに痛々しいコードではある。そのうえ効率は悪いし同じ並びが逆順で二度出るという欠点もある。だが、発表しないことには叩くこともできない。とりあえず曝しておきます。はい御免ください。

/*
* ゴロム環の計算(Golomb.java) 第 3 版
*/
class Golomb {
final static int SIZE = 9;
final static int WORKSIZE = SIZE + SIZE;
static int aax[];
static int vals[];
static int maxnum;
static Ring ring;
public static void main( String args[] ) throws Exception {
aax = new int[ SIZE ];
vals = new int[ SIZE ];
maxnum = ( SIZE * (SIZE - 1 ) ) / 2 + 1;
vals[0]=1;
_combi( 1, 2, maxnum, SIZE - 1, SIZE * (SIZE - 1) );
System.out.print( "completed." );
System.exit( 0 );
}

/* 合計が maxnum になる組合せを作る */
static void _combi( int ord, int nx, int ny, int n, int sum ) {
if ( n == 1 ) {
if ( ( nx <= sum ) && ( sum <= ny ) ) {
vals[ SIZE - 1 ] = sum;
for ( int cnt = 0 ; cnt < SIZE ; cnt += 1 ) {
aax[ cnt ]= vals[ cnt ];
}
_golomb( 0 );
}
} else {
for ( int ns = nx ; ns < ( ny - n + 1 ) ; ns += 1 ) {
vals[ ord ] = ns;
_combi( ord + 1, ns + 1, ny, n - 1, sum - ns );
}
}
}

/* 組合せから順列を作る。*/
static void _golomb( int n ) {
if ( n < SIZE ) {
if ( n == 0 ) {
_golomb( 1 );
} else {
_golomb( n + 1 );
for (int cnt = n + 1 ; cnt < SIZE ; cnt +=1 ) {
// swap aax[ n ], aax[ cnt ]
int wk = aax[ n ];
aax[ n ] = aax[ cnt ];
aax[ cnt ] = wk;
_golomb( n + 1 );
// swap aax[ n ], aax[ cnt ]
wk = aax[ n ];
aax[ n ] = aax[ cnt ];
aax[ cnt ] = wk;
}
}
} else {
ring = new Ring( aax ); // このあたりが Java
if ( ring.check() ) {
ring.Print();
}
}
}

static class Ring {
static int MAXVAL;
int workx[];
Ring( int aa[] ) {
int cnt;
MAXVAL = ( SIZE - 1 ) * SIZE + 1;
this.workx = new int[ WORKSIZE ];
for ( cnt = 0 ; cnt < SIZE ; cnt += 1 ) {
this.workx[ cnt ] = aa[ cnt ];
this.workx[ cnt + SIZE ] = aa[ cnt ];
}
}

boolean check() {
int vtable[] = new int[ MAXVAL ]; // 0 要素を使わないかわりに、合計(MAXVAL自身)も出てこないから
for ( int cnt = 0 ; cnt < MAXVAL ; cnt += 1 ) {
vtable[ cnt ] = 0;
}
for ( int cnt = 0 ; cnt < SIZE ; cnt += 1 ) {
vtable[ this.workx[ cnt ] ] = 1;
}
for ( int posCnt = 0 ; posCnt < SIZE ; posCnt += 1 ) {
int sum = this.workx[ posCnt ];
for ( int lenCnt = 1 ; lenCnt < ( SIZE - 1 ) ; lenCnt += 1 ) {
sum += this.workx[ posCnt + lenCnt ];
if ( vtable[ sum ] == 0 ) {
vtable[ sum ] = 1;
} else {
return false;
}
}
}
return true;
}

/* 表示 */
void Print(){
for ( int cnt = 0 ; cnt < SIZE - 1 ; cnt += 1 ) {
System.out.print( this.workx[ cnt ] );
System.out.print( "-" );
}
System.out.println( workx[ SIZE - 1 ] );
}
}
}

 (所長)
スポンサーサイト
脂肪燃焼成分が312倍!?あの辛口司会者も認めたサプリが話題に
1日1粒を守ってください。じゃないと骨と皮だけになってしまいます!?
体重がどんどん落ちる?『めざましテレビ』や『バイキング』でも紹介された運動...

コメントの投稿

非公開コメント

プロフィール

Maria Bethany

Author:Maria Bethany
 コラボレーション集団『大森総合研究所』研究員、兼・広報担当。
 語彙論に興味を持つ。
 主な業績は、動詞活用における“指標音としてのハ行音の消失に伴う、四段活用ハ行動詞の五段活用ワ行動詞への移行”における母音ア・オ・ウ音の指標化の検証。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。