マジックナンバーが見つからない・・・
ここで、乗算一回方式の Magic Bitboard が発表されています。
http://www.graco.c.u-tokyo.ac.jp/~issei/GPW_Proposal%20and%20Implementation%20of%20Magic%20Bitboards%20in%20Shogi.pdf
自分のソフトをどんなレイアウトにするかは検討中ですが、
とりあえずここで発表されたレイアウトで試してみました。
乗算一回方式を発表されていますが、資料のリンク先のマジックナンバーは
乗算二回方式のもののようです。
発表資料のビットレイアウトは以下のようになっています。
変数1 変数0
09 00 54 ・・・ 00 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 17 08 63 ・・・ 08
変数0,変数1のビット単位のorを取っても、occupied bitboard の
ビットが立つ位置は衝突しないため、or を取ってから マジックナンバー を
掛ければ、乗算が一回で済むということらしいです。
そういうことなので、
乗算一回方式のマジックナンバーを乱数を使って探してみました。
const uint64_t RookMagic[81] = { UINT64_C(0x40000101010100), UINT64_C(0x240040106000100), UINT64_C(0x4080021801022080), UINT64_C(0x8080008401822040), UINT64_C(0x4c00200082008d0), UINT64_C(0x80014440094010), UINT64_C(0x8040018002858c04), UINT64_C(0x80800082100e4a0c), UINT64_C(0x40001208010112), UINT64_C(0x8004100081020080), UINT64_C(0x204040022212000e), UINT64_C(0x9000180000800090), UINT64_C(0x82200100240240), UINT64_C(0x1800200100240410), UINT64_C(0xc001000200a0008), UINT64_C(0x200100420020002), UINT64_C(0x1000201000100002), /***Failed***/ UINT64_C(0x0), UINT64_C(0x4004981000068111), UINT64_C(0x2020004801000080), UINT64_C(0x48001002890001), UINT64_C(0x6302222002008002), UINT64_C(0x2914002001001032), UINT64_C(0x400100800200504), UINT64_C(0xc0003000200004), UINT64_C(0x280002004208224), UINT64_C(0x454004100006209e), UINT64_C(0x6108500008004081), UINT64_C(0xa000100008010841), UINT64_C(0x4440008010001), UINT64_C(0x1834001008002840), UINT64_C(0x4040020008011090), UINT64_C(0x86001008000918), UINT64_C(0x300204008001001), UINT64_C(0x1880088110008a04), UINT64_C(0x7040000888002082), UINT64_C(0x408080800140021), UINT64_C(0xc020003400220040), UINT64_C(0x2440140040840080), UINT64_C(0x3034000200040011), UINT64_C(0x840009100040010), UINT64_C(0x2c1000028040010), UINT64_C(0x44400080020c0014), UINT64_C(0x80001040080004), UINT64_C(0x8040022802440002), UINT64_C(0x10482014c4000600), UINT64_C(0x4470000200023100), UINT64_C(0x1002002100010880), UINT64_C(0x400040000800201), UINT64_C(0x220202002008004), UINT64_C(0x100010000200201), UINT64_C(0x2080008000100201), UINT64_C(0x8800010000201), /***Failed***/ UINT64_C(0x0), UINT64_C(0x6001c20a040011), UINT64_C(0x90254108401040c), UINT64_C(0x523c040008450001), UINT64_C(0x88006000410222), UINT64_C(0xbc000980023201), UINT64_C(0x202888008012001), UINT64_C(0x1000200840c1024), UINT64_C(0x224100a0044008), UINT64_C(0x2010904008208c), UINT64_C(0xa8c0000248014500), UINT64_C(0x60001200024880), UINT64_C(0x20400800180040c0), UINT64_C(0x40040000504001), UINT64_C(0x40020008240410), UINT64_C(0x4080004101280210), UINT64_C(0x8680002000312088), UINT64_C(0x80008348080004), UINT64_C(0x40008812080001), UINT64_C(0x250200000889500), UINT64_C(0x204100041000080), UINT64_C(0x20400204862080), UINT64_C(0xc002a00040800040), UINT64_C(0x101200020800010), UINT64_C(0xa00070200010), UINT64_C(0x1a4a200011200004), UINT64_C(0x1800200005080084), UINT64_C(0x10220000403036a), }; const uint64_t BishopMagic[81] = { UINT64_C(0x434146e100100208), UINT64_C(0x20808c0402a8e0c), UINT64_C(0x6081010100808), UINT64_C(0x409008108900002), UINT64_C(0x2028510000811), UINT64_C(0x2060440200820000), UINT64_C(0x1006108100620002), UINT64_C(0x2010108008410022), UINT64_C(0x1028400a10804804), UINT64_C(0x5010011081002004), UINT64_C(0x88250200481804), UINT64_C(0x1220c022100804), UINT64_C(0x2407810080010e0c), UINT64_C(0x4008010020811100), UINT64_C(0x100508021410050), UINT64_C(0x80001220410080), UINT64_C(0xc00008480112040), UINT64_C(0x1001084018102542), UINT64_C(0x202000100800420), UINT64_C(0x22a00201201110), UINT64_C(0x1804082010200208), UINT64_C(0x2004000448810102), UINT64_C(0x2020050208400), UINT64_C(0x22105040208022), UINT64_C(0x8808008100c4208), UINT64_C(0x208e21a0aa01040), UINT64_C(0xa03430420180102), UINT64_C(0x808a08a031008040), UINT64_C(0x1004c0432000a4c), UINT64_C(0xc010014a00108), UINT64_C(0x220040206080102), UINT64_C(0x401002008288041), UINT64_C(0x120402000228010), UINT64_C(0x2000801001232002), UINT64_C(0x206608000100108), UINT64_C(0x4804082000060401), UINT64_C(0x1002204110010008), UINT64_C(0x5040200400008b0), UINT64_C(0x52000480044009), UINT64_C(0x2040080000210), UINT64_C(0x810204008002001), UINT64_C(0x404c00404821002), UINT64_C(0x4202001000ca42), UINT64_C(0x2c00210010801102), UINT64_C(0x81602001010804), UINT64_C(0x4054a010a601100), UINT64_C(0x93002200400022), UINT64_C(0x8014083410802140), UINT64_C(0xc200101850800402), UINT64_C(0x4624420020040130), UINT64_C(0x4210803020004c), UINT64_C(0x10020214060001), UINT64_C(0xa004a0850024306), UINT64_C(0x413818090110124), UINT64_C(0x4034102700438008), UINT64_C(0x200210400884600c), UINT64_C(0x1400440102804005), UINT64_C(0x500003004008120), UINT64_C(0x8400002105014201), UINT64_C(0x200090091082800), UINT64_C(0x10010200208842), UINT64_C(0x2028008100b01080), UINT64_C(0x4218110108086300), UINT64_C(0x200800841021120), UINT64_C(0xc5800a40211004), UINT64_C(0x8010084021020830), UINT64_C(0x140028488020110), UINT64_C(0x10081009008), UINT64_C(0x2808486688c28408), UINT64_C(0xa400048903004506), UINT64_C(0x5c90c384800204), UINT64_C(0x10c8144540028204), UINT64_C(0x1404804020020430), UINT64_C(0x42a001020460440), UINT64_C(0x914000910200801), UINT64_C(0x1808403000180492), UINT64_C(0xc400100002084484), UINT64_C(0x24c330080b008124), UINT64_C(0x44804a0800814821), UINT64_C(0x2200040545801202), UINT64_C(0x102140010920402), };
RookMagic[17], RookMagic[53] が見つからない。
2九、6九の位置ということになる。
どうしたものか。