Are these set of magics correct?

Discussion of chess software programming and technical issues.

Moderators: hgm, Rebel, chrisw

User avatar
vittyvirus
Posts: 646
Joined: Wed Jun 18, 2014 2:30 pm
Full name: Fahad Syed

Are these set of magics correct?

Post by vittyvirus »

Be sure to have a look at RShift and BShift before testing these magics.

Are these correct?

Code: Select all

const uint64 RMagic[64] = {
 0x2000080400082868ULL,
 0x502800b040500250ULL,
 0x408060010100020ULL,
 0x147012100c0ULL,
 0x280202800c060041ULL,
 0x21002001048808cULL,
 0xa02200c800110a1ULL,
 0x2014c51020000895ULL,
 0x1128500800000811ULL,
 0x80114016000812ULL,
 0x200a1d0000000050ULL,
 0x6106040400000ed0ULL,
 0x40020a0220400201ULL,
 0x8410000820410022ULL,
 0x20802000008002e2ULL,
 0x2000000000119ULL,
 0x8400000000040040ULL,
 0x49010000002000aeULL,
 0x80004008100004ULL,
 0x120024c0000640c0ULL,
 0x2040c04020011ULL,
 0x80801800025004ULL,
 0x2000008018082452ULL,
 0x12004221411c41ULL,
 0x100214000004c008ULL,
 0x200022003101ULL,
 0x1000901000a0040ULL,
 0x10405430410220ULL,
 0x20010c080a480920ULL,
 0x5040000080018200ULL,
 0x400202200418300ULL,
 0x92008080040f1ULL,
 0x4000050440041008ULL,
 0x40400800000420ULL,
 0x210210000510008ULL,
 0x40108100081000ULL,
 0x4000882008408ULL,
 0x88000420c40b1ULL,
 0x48000180000450aULL,
 0x90006a1000000841ULL,
 0x10020200000410a2ULL,
 0x1309003000200aULL,
 0x6604008008840008ULL,
 0x8021c0000108f00ULL,
 0x412c00011050204ULL,
 0x20c200e800010204ULL,
 0x111008002040a201ULL,
 0x800000004842800bULL,
 0x90000000041080ULL,
 0x206004008400210ULL,
 0x8009a003160010ULL,
 0x4000010922a18400ULL,
 0x2240400040812a1ULL,
 0x400010246029ULL,
 0x2282053004024441ULL,
 0x10600440651800bULL,
 0x89800080004900aULL,
 0x1280a040000288ULL,
 0x6201000210892004ULL,
 0x8001000041180200ULL,
 0x4201a00000080201ULL,
 0x6a40000068420c1ULL,
 0x2110014080008102ULL,
 0x200c00c08408049ULL
};

const uint64 BMagic[64] = {
 0x300000504204430ULL,
 0x8000d4010021052ULL,
 0x4800041022a20811ULL,
 0x482080a10020202ULL,
 0x80011120441910c1ULL,
 0x410880820085ULL,
 0x51010c2001041105ULL,
 0x2008244a0122ULL,
 0x8003584000a12041ULL,
 0x603002002220213ULL,
 0xc00489100000872ULL,
 0x244880001444a2ULL,
 0x887000054089103ULL,
 0x46001218040044ULL,
 0xc020060001050c1ULL,
 0x802201200122ULL,
 0x201841c01080005ULL,
 0x44400000418a20ULL,
 0x4040204220004ULL,
 0x148802100060404ULL,
 0x803040000021024ULL,
 0x408000028411082ULL,
 0x20000a280e010002ULL,
 0xc00090401484105ULL,
 0x8c0000000600dd8ULL,
 0x2080e09384028408ULL,
 0xc440248021104102ULL,
 0x2018040124204100ULL,
 0x110080000001044cULL,
 0x2000010884962303ULL,
 0xa0e004008010050ULL,
 0x4000000000003b08ULL,
 0x20004200004a050ULL,
 0x6400140610008820ULL,
 0x48d001430048644ULL,
 0x20004000b084202ULL,
 0x1085400101ULL,
 0x9020100884011011ULL,
 0x2000036209aULL,
 0xa4210000021049ULL,
 0x980005114480802ULL,
 0x820040a1a2020210ULL,
 0xa000009883302ULL,
 0x8801044004800045ULL,
 0x8040005800000a21ULL,
 0x40400001900e6414ULL,
 0x8404004042084121ULL,
 0xc84000408186ULL,
 0x84085a8201ULL,
 0x52940904060a0086ULL,
 0x40400088410c124ULL,
 0x410004005701081ULL,
 0x8300704e04810008ULL,
 0x488104160284010ULL,
 0x80248002000d0210ULL,
 0x80000a0201092802ULL,
 0x410000320121a228ULL,
 0x1102104000909884ULL,
 0x164806001400243ULL,
 0x18000003080048ULL,
 0x15000002404002eULL,
 0x10000004404140ULL,
 0x8a800100d30a020ULL,
 0x80000301081112ULL
};

const uint64 RShifts[64] = {
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58
};

const uint64 BShifts[64] = {
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58,
 58, 58, 58, 58, 58, 58, 58, 58
};

Took 0.250470 seconds

======================================

const uint64 RMagic[64] = {
 0x2c00030010a228ULL,
 0x8008480c00080201ULL,
 0x20a4002452a0005ULL,
 0x900802000004100ULL,
 0x181000228402ULL,
 0x10000600120104ULL,
 0xc000040550000e01ULL,
 0x400000108000411ULL,
 0x8024810000004040ULL,
 0x6000880012000408ULL,
 0x412009004008ULL,
 0x2000512098003080ULL,
 0x40001010208ULL,
 0x4008004ca1109ULL,
 0x8481020804800031ULL,
 0x220097840000041ULL,
 0x1800000000150240ULL,
 0xb0124002000288ULL,
 0x48882000811e001ULL,
 0xa84400102480000ULL,
 0x40001008104014ULL,
 0x5000490410008004ULL,
 0x8604a00802088a1ULL,
 0x10002a0a01400481ULL,
 0xc04040000028900ULL,
 0x8040212082002200ULL,
 0x4044012c104000ULL,
 0x280100046320ULL,
 0x2002c1008980ULL,
 0x840405200011145ULL,
 0x240040820011a0ULL,
 0x41002a00004090ULL,
 0x1082048000088010ULL,
 0x8040107000220ULL,
 0x4000808188024008ULL,
 0x2c0408801040300ULL,
 0x2400002802010408ULL,
 0x8020000004460401ULL,
 0x41c00019212061ULL,
 0x40a010040000821ULL,
 0x824601a00104880ULL,
 0x200e00000402149ULL,
 0x8110002000040020ULL,
 0x40080440ULL,
 0x2206000040108042ULL,
 0x208004031082c05ULL,
 0x2424008608201ULL,
 0x4280000010014021ULL,
 0x404600081058ULL,
 0x880230d0000814ULL,
 0x1100020000008004ULL,
 0x10100608600a0400ULL,
 0x3440800008064102ULL,
 0x1002028484201882ULL,
 0x20000020404113ULL,
 0x60514011281ULL,
 0x8810c00002d880ULL,
 0x100054124000242ULL,
 0x813000026840001ULL,
 0x20010a00111620ULL,
 0x4000022200882801ULL,
 0xa0000108408123ULL,
 0xa0803006008009ULL,
 0x10804048000010a9ULL
};

const uint64 BMagic[64] = {
 0x4001040160022230ULL,
 0x801a0040220c4208ULL,
 0x40001c0010500112ULL,
 0x1808001800c103ULL,
 0x820218200286a20ULL,
 0x106000003c10042ULL,
 0x804040248002922ULL,
 0x40864444018ULL,
 0x280234840820220ULL,
 0x2020000824099ULL,
 0x1042006200634ULL,
 0x401014288000882ULL,
 0x101104010811301ULL,
 0x1203010100082ULL,
 0x1004002040445021ULL,
 0x200000088205086ULL,
 0x6001000882100428ULL,
 0x412100400240922ULL,
 0x8010000409a806ULL,
 0x10003011007a4484ULL,
 0x3c00421000109801ULL,
 0x6050002018080809ULL,
 0x20244001100248a1ULL,
 0x42801802091051ULL,
 0x4c1a4060024230ULL,
 0x8490180000a1a00ULL,
 0xc04004a1028800ULL,
 0x400801006032024ULL,
 0x4020058080200a00ULL,
 0x20000a9898040301ULL,
 0x8010008c044610ULL,
 0x201a028020112ULL,
 0x10b010180005002ULL,
 0x8088040020220ULL,
 0x818000008c94028ULL,
 0x2260801104ULL,
 0x2705c000b84a2009ULL,
 0x4040808010110441ULL,
 0x2408001d0100405cULL,
 0x805120400081143ULL,
 0x4201c1420004118ULL,
 0x4400172020c40026ULL,
 0x824430208b20114ULL,
 0x903000003000025ULL,
 0x200013300c010122ULL,
 0x88522080a2081005ULL,
 0x841900248ULL,
 0x20082118822d0802ULL,
 0x2019064a84840401ULL,
 0x2005400092044208ULL,
 0x800000500022800cULL,
 0x9200830120801ULL,
 0x101011980084122ULL,
 0x5620710000104164ULL,
 0x1208300020512ULL,
 0x410002101101002ULL,
 0x100155080a08ULL,
 0x8208400080842121ULL,
 0x9020000401a001ULL,
 0xac002024202ULL,
 0x44800908210c24ULL,
 0x82200008002060ULL,
 0x20a0000a08004090ULL,
 0x11008881418448ULL
};

const uint64 RShifts[64] = {
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57
};

const uint64 BShifts[64] = {
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57,
 57, 57, 57, 57, 57, 57, 57, 57
};

Took 0.132034 seconds

======================================

const uint64 RMagic[64] = {
 0x2229c00200022040ULL,
 0x100200840c0084ULL,
 0x40c0640004d00020ULL,
 0x8000808082402100ULL,
 0x8814008200040418ULL,
 0x2000400800022112ULL,
 0x8208520008021c1ULL,
 0x120a010000300247ULL,
 0x80006a20ULL,
 0x10980002000008aULL,
 0x10110000090008ULL,
 0x4410005010320048ULL,
 0x28808300200204ULL,
 0x100100260a280011ULL,
 0x2c40000c4080306ULL,
 0x100c940044400209ULL,
 0x1500800000010008ULL,
 0x20018002001800a8ULL,
 0x22000400d0001ULL,
 0x4092010480220860ULL,
 0x200048a080008201ULL,
 0x5020041000020004ULL,
 0x2201000000a01ULL,
 0x90000006a8018011ULL,
 0x90118000016e04ULL,
 0x8c200c1804000c00ULL,
 0x8804010802020010ULL,
 0xc0780c07400ULL,
 0x420500100482490ULL,
 0x4040010080718080ULL,
 0x1002010000300c0ULL,
 0x4000004001201884ULL,
 0x8010004900028820ULL,
 0x1a00448220000804ULL,
 0x20000a040040020ULL,
 0x2000000c0100090ULL,
 0x100000440012ULL,
 0x48801044404605ULL,
 0xb000010041142ULL,
 0x600001002522145ULL,
 0x2d108100020840ULL,
 0x210880170000240ULL,
 0xc10c10000008002ULL,
 0x30010000a004400ULL,
 0x900088040800180aULL,
 0x100c104000006182ULL,
 0x41041500d000502aULL,
 0x400c001000002011ULL,
 0x2004000400012040ULL,
 0x4a5012000000050cULL,
 0x60001810442001ULL,
 0x160000000020c0ULL,
 0x5401004100a02801ULL,
 0x20a2d040080c01ULL,
 0x80080210000e01ULL,
 0x50d204001c01013ULL,
 0x118800012080ULL,
 0x7002c00000088ULL,
 0x8100205000050018ULL,
 0x11003a2241100ULL,
 0x710013012282ULL,
 0x40204000c004c0c2ULL,
 0x48402800a14341ULL,
 0x8004081801418011ULL
};

const uint64 BMagic[64] = {
 0x80000844001108f0ULL,
 0x10000a0020220404ULL,
 0x1041220800100382ULL,
 0x8001010220004401ULL,
 0x220000c200010044ULL,
 0xa81220028050ULL,
 0x40242200140101ULL,
 0x8108008048841ULL,
 0x8400020946341302ULL,
 0x4010049011510ULL,
 0x92318000001868ULL,
 0x4c0c90018000405ULL,
 0x10408240410a122ULL,
 0x204245000022028ULL,
 0x510010a0e44ULL,
 0x90000102a220a4ULL,
 0xa000a388ULL,
 0x8a10001010024ULL,
 0x204180004080210ULL,
 0x212100484005008ULL,
 0x200484400020101ULL,
 0x100008200089941ULL,
 0x10080108081630f4ULL,
 0x2882c02898022042ULL,
 0xc000244200118410ULL,
 0x1000000056a4100ULL,
 0x8a03400200003000ULL,
 0xc0000c00002100a0ULL,
 0x184200201041482ULL,
 0x400908504010144ULL,
 0x202800004008942ULL,
 0x888820482120251ULL,
 0x842880040241805ULL,
 0x8100000000447c30ULL,
 0x10000050002a3230ULL,
 0xc20a080200090082ULL,
 0x260a400808140182ULL,
 0x4002000008c602ULL,
 0x80080855000c4059ULL,
 0x8010001c14841ULL,
 0x4010180248001081ULL,
 0x4082311401081108ULL,
 0x404290000120a109ULL,
 0x8000080402216ULL,
 0x8000a00c0004101ULL,
 0x6a100000220090c8ULL,
 0x1200000801000abULL,
 0x420000068c820022ULL,
 0x402088203080d02ULL,
 0x2000003009142201ULL,
 0x2080250368804ULL,
 0x6800001009022011ULL,
 0x842601204082402ULL,
 0xc000100010003052ULL,
 0xa000002200163010ULL,
 0x95a1000042182ULL,
 0x8088010042210aULL,
 0x2400802408441012ULL,
 0x40041000a240a1ULL,
 0x460808600110ULL,
 0x21000041011401ULL,
 0x80100001490ULL,
 0x4050101022480444ULL,
 0x14800800048051eULL
};

const uint64 RShifts[64] = {
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56
};

const uint64 BShifts[64] = {
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56,
 56, 56, 56, 56, 56, 56, 56, 56
};

Took 0.097702 seconds

======================================

const uint64 RMagic[64] = {
 0x2800000002a104ULL,
 0x81000000018040ULL,
 0x4800004b001ULL,
 0x204000020580100ULL,
 0x22600070020801ULL,
 0x2000000400060604ULL,
 0x8120002018609ULL,
 0x615081400020211ULL,
 0x1000080c000200eULL,
 0x20a0000e80002030ULL,
 0x2808200411400101ULL,
 0xa0420200001028ULL,
 0xc010809c04044081ULL,
 0xd122a00000000c1cULL,
 0x4029020000010802ULL,
 0x10008422b8412001ULL,
 0x620804004004bULL,
 0x2008080000040ULL,
 0x4130800204040001ULL,
 0x2000000180050080ULL,
 0x206c02000001004ULL,
 0x8000402842ULL,
 0x801042000005842ULL,
 0x818800300c4410a1ULL,
 0x4840020020010440ULL,
 0x40400010001000ULL,
 0x1402048002200180ULL,
 0x8000300004080200ULL,
 0x4084082032200ULL,
 0x884218380024422ULL,
 0x4080000000204ULL,
 0xe1000c0002403081ULL,
 0x100003000011008ULL,
 0x220008d010000410ULL,
 0x4000090901580002ULL,
 0x89040b8300010ULL,
 0x44008088c002a301ULL,
 0x8002801008c0006ULL,
 0x16810040280803ULL,
 0x8500008443021009ULL,
 0x48010800010828ULL,
 0x50090800014cULL,
 0x1001002001020004ULL,
 0x42541010a1014220ULL,
 0x8040001000200901ULL,
 0x10200080025004ULL,
 0xc502800202011811ULL,
 0x206002281c00423ULL,
 0x401008000028020ULL,
 0x4022000240000110ULL,
 0x800810200044ULL,
 0x401004200802808ULL,
 0x84008a404416ULL,
 0x2500020000100aULL,
 0x4124001012002ULL,
 0x2000400000401a09ULL,
 0x8000000000a004ULL,
 0x208920018000041ULL,
 0x400882100003ULL,
 0x900109200010080ULL,
 0x20000000201011aULL,
 0x4404258200001004ULL,
 0x8882080000900402ULL,
 0x2c0000400000c001ULL
};

const uint64 BMagic[64] = {
 0x128000800600087ULL,
 0x10010403400a100aULL,
 0x8000200e2063244ULL,
 0xc00083080a281ULL,
 0x844006000a0082ULL,
 0x185848008228c2ULL,
 0x400454240008904ULL,
 0x8008011800010424ULL,
 0x1015002008ULL,
 0x80200801104408ULL,
 0xe0044012b04c2041ULL,
 0x500000182200044ULL,
 0x28082408000409ULL,
 0x8011008a400406ULL,
 0x463020028642ULL,
 0x4040842090000942ULL,
 0x804b050000804218ULL,
 0x4100590410410060ULL,
 0x203001222c1804ULL,
 0x2008000104180105ULL,
 0x2c803000212802ULL,
 0x420013848101401ULL,
 0x8c008c004084ULL,
 0x406101623100202ULL,
 0x100504203080a000ULL,
 0x180000108410b20ULL,
 0x20000202600ULL,
 0x12004000128a0020ULL,
 0x3300000a0080a0ULL,
 0x8044004000003104ULL,
 0x200c04828804ULL,
 0x20a80100048091ULL,
 0x488120420300119ULL,
 0x2011200008345310ULL,
 0x100002c008ULL,
 0x128300000000412ULL,
 0x2880420804040049ULL,
 0x5110002800808091ULL,
 0x12882104140084ULL,
 0x1a8000108420542ULL,
 0x12031008810ULL,
 0x980a2d004020888ULL,
 0x40468c20210201ULL,
 0x1c300022020402ULL,
 0x8808200040281ULL,
 0x6844300410ULL,
 0x84200050868ULL,
 0x4808010500202803ULL,
 0x1000030140201082ULL,
 0x410201d00040401aULL,
 0xa900050008c904ULL,
 0x2810c0000a400002ULL,
 0x1200408004514020ULL,
 0x940022020918ULL,
 0x802001300020830ULL,
 0x4464010400230a41ULL,
 0x42001180200a401ULL,
 0x8001008a0102ULL,
 0x822080424501ULL,
 0x100100000420200ULL,
 0x4000000000b0040ULL,
 0x20220300301ULL,
 0x800440800e49ULL,
 0x10000089102d0022ULL
};

const uint64 RShifts[64] = {
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55
};

const uint64 BShifts[64] = {
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55,
 55, 55, 55, 55, 55, 55, 55, 55
};

Took 0.076183 seconds

======================================

const uint64 RMagic[64] = {
 0x200030000004014ULL,
 0x411300000208040ULL,
 0x840810c0050004ULL,
 0x810000204318a0ULL,
 0x24044000048104ULL,
 0x4000004000001482ULL,
 0xa02000400100406ULL,
 0x421084080a184011ULL,
 0x124020400000230ULL,
 0x884402000000024ULL,
 0x8000010040002004ULL,
 0x81040008024c14ULL,
 0xc000608000490406ULL,
 0x1000020090610014ULL,
 0x8003400088000021ULL,
 0x8000040122001ULL,
 0x4080000000006042ULL,
 0x82d0100000000c06ULL,
 0x18010040040002ULL,
 0x4000008060501900ULL,
 0x401000030042001ULL,
 0x44000460d451003ULL,
 0x40000200101146ULL,
 0x2002000a024045ULL,
 0x4c8080000008420ULL,
 0x800100080e20020ULL,
 0x8130000821002140ULL,
 0x1221220080a2084ULL,
 0x9000000402240900ULL,
 0x4920c8020101100ULL,
 0x4100aa20021222ULL,
 0x4091284c08122ULL,
 0x1020000004c080ULL,
 0x8000800020002010ULL,
 0x4004640010210004ULL,
 0x40280482080a0346ULL,
 0x4420480010008ULL,
 0x1000080000012c4ULL,
 0x4018081000005201ULL,
 0xa08000200001020dULL,
 0xa4480200004001ULL,
 0x918000c00020ULL,
 0x1100040108001ULL,
 0x3048360000008030ULL,
 0x100051a08c0048ULL,
 0x240000040a804014ULL,
 0x10201024040001b3ULL,
 0xc20000240004041ULL,
 0x200400280008064ULL,
 0x40201002040102dULL,
 0x2000108041460001ULL,
 0x41000010c42680ULL,
 0x8001c3000508ULL,
 0x2010104005a502ULL,
 0x2082008c0801ULL,
 0x4000224428002005ULL,
 0xa001200000021020ULL,
 0x4100008408601068ULL,
 0xa4090400008001ULL,
 0x8a00800c00060040ULL,
 0x2408045110001004ULL,
 0x402201002804ULL,
 0x800c3000a00288d1ULL,
 0x1111000010016081ULL
};

const uint64 BMagic[64] = {
 0x8190040400202ULL,
 0x2008308020851004ULL,
 0x2421024801810403ULL,
 0x4400008061002ULL,
 0x111915005002008ULL,
 0x800004006c008404ULL,
 0x18620110100aULL,
 0x2414040000011c82ULL,
 0x900000080044b42ULL,
 0x40000000e202003ULL,
 0xc0005084e00120c8ULL,
 0x1808a000020101ULL,
 0x10304506800192ULL,
 0x1820380280900818ULL,
 0x44c01901088ULL,
 0x240006a08024ULL,
 0xc06a09088410ULL,
 0x42000400415400aULL,
 0x8809804009192ULL,
 0x421004054005402ULL,
 0x62001008801040a2ULL,
 0x801410000420081ULL,
 0x80000124c1c0122ULL,
 0x2001008629804011ULL,
 0x4002001009700401ULL,
 0x2010100037c0060ULL,
 0x200c30080000884ULL,
 0x6604000c004098ULL,
 0x881230042210090ULL,
 0x201041200006388ULL,
 0x2121248000014808ULL,
 0x4100284400e0ULL,
 0xc4802119a0022098ULL,
 0x807400490102108ULL,
 0x802081000010121ULL,
 0xc000828003020808ULL,
 0x8e43000000045012ULL,
 0x1610025900280851ULL,
 0xea00000030094ULL,
 0x200026440020009ULL,
 0x9000e008000428ULL,
 0x4600501040004a3ULL,
 0x5000c40308001488ULL,
 0x8084046000500801ULL,
 0x810409183a00088dULL,
 0x4808446ULL,
 0x81108080010022c9ULL,
 0x1000106408940041ULL,
 0x20010010350910ULL,
 0x8000240441021495ULL,
 0x200b002000181021ULL,
 0x101000083040001ULL,
 0x408000810a8010ULL,
 0xa2818a1000420ULL,
 0x10030800300440cULL,
 0x48980220c1090401ULL,
 0x400492500001414ULL,
 0x40008410c2014ULL,
 0x112120220a100281ULL,
 0x200002080500ULL,
 0x808080088442ULL,
 0x2080004d412003ULL,
 0x4404201044e509ULL,
 0x1006080000040104ULL
};

const uint64 RShifts[64] = {
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54
};

const uint64 BShifts[64] = {
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54,
 54, 54, 54, 54, 54, 54, 54, 54
};

Took 0.076327 seconds

======================================

const uint64 RMagic[64] = {
 0x2004068800002280ULL,
 0x104000400000108ULL,
 0x80209020054820ULL,
 0x20800011002b180ULL,
 0x20421d020106800cULL,
 0x2008000822e2ULL,
 0x40021800206021ULL,
 0x2000800900080041ULL,
 0x10054020000204ULL,
 0xe001400000201040ULL,
 0x600024802220ULL,
 0x2088000100200100ULL,
 0x1000018802008012ULL,
 0x106220809840001ULL,
 0x8500044841034c02ULL,
 0x1800001000091ULL,
 0x80200000008008ULL,
 0x2010041200000028ULL,
 0x482020000008001ULL,
 0x4088018480001100ULL,
 0x408c0c002008014ULL,
 0x6100800200ca01ULL,
 0x464206010822801ULL,
 0x18401020010c0241ULL,
 0x5100900000008404ULL,
 0x8902000000800100ULL,
 0xc3510400000881ULL,
 0xc00c00000c020408ULL,
 0x201120c900ULL,
 0x100000001010aULL,
 0x80a0801000220804ULL,
 0xc214000002010108ULL,
 0x1100400800004802ULL,
 0x646280000004c020ULL,
 0x4104847010a0004ULL,
 0x8009000804a06ULL,
 0x2c00110008208482ULL,
 0x40100200884123ULL,
 0x200540200006801ULL,
 0x6200120062000129ULL,
 0x10c0003000011034ULL,
 0x100189008800081ULL,
 0x10020a06018ULL,
 0x1108000c102008ULL,
 0x500830244041003ULL,
 0x181000000404001ULL,
 0x60020000a09ULL,
 0x2108411001ULL,
 0x10208008000f080ULL,
 0x2008a00000181044ULL,
 0x809004104080004ULL,
 0x280000710ULL,
 0x920440c42050008ULL,
 0x300000800010006ULL,
 0x400c40810020082ULL,
 0x20400800a2500503ULL,
 0x40085048000092a0ULL,
 0x7060184000004c4ULL,
 0x440220082240020ULL,
 0x4000040093001040ULL,
 0x1800204009028ULL,
 0x1000484022001ULL,
 0x2000000800025021ULL,
 0xc004000610e41ULL
};

const uint64 BMagic[64] = {
 0x800088231009028ULL,
 0x4260050090092004ULL,
 0x61810400814089ULL,
 0x110022012444020aULL,
 0xb205080002021ULL,
 0x200c04c000005c10ULL,
 0x118800a808080c92ULL,
 0x610444503ULL,
 0x419201002c900041ULL,
 0x50108200302ULL,
 0x40068064009ULL,
 0x1080118c41800401ULL,
 0x403081088612ULL,
 0x200265000003d9ULL,
 0x110221821401045ULL,
 0x282000c02811002ULL,
 0x2820080001458840ULL,
 0x8706080068004010ULL,
 0x86002088300c0088ULL,
 0x41681c0020510018ULL,
 0x1822402082001ULL,
 0x1004b00480001006ULL,
 0x4800014008021ULL,
 0x80328125001c01ULL,
 0x800002040c081049ULL,
 0x8424440005320ULL,
 0x8f0600080182560ULL,
 0x2040002004010800ULL,
 0x40000a200ULL,
 0x1022050080150ULL,
 0x20048115001ULL,
 0x2100880000426102ULL,
 0x2212025000400920ULL,
 0x80a00c704400520ULL,
 0x892804810c0240cULL,
 0x220000404459092ULL,
 0x20804001088403ULL,
 0x108001821281ULL,
 0x408a138088810401ULL,
 0x4085400000040501ULL,
 0xc11090002020ULL,
 0xa002110281042103ULL,
 0x1002140a000202ULL,
 0x1006000032020002ULL,
 0x4846020480200182ULL,
 0x8021002004809ULL,
 0x8004006020058ULL,
 0xc8010050040981ULL,
 0x380a0100111ULL,
 0x8010002720010804ULL,
 0x11002a8082822004ULL,
 0x4022010c0500002ULL,
 0x80c8030041b01010ULL,
 0xa001006401120ULL,
 0x21024c00020142ULL,
 0x1128844a08800c08ULL,
 0x40000828080b002ULL,
 0x8040184001ULL,
 0x40600001a0a0003ULL,
 0x400c50804380010ULL,
 0x10000400431441ULL,
 0x20c201030131009ULL,
 0x40242000c3004002ULL,
 0x1021030001c00214ULL
};

const uint64 RShifts[64] = {
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53
};

const uint64 BShifts[64] = {
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53,
 53, 53, 53, 53, 53, 53, 53, 53
};

Took 0.067283 seconds

======================================

const uint64 RMagic[64] = {
 0x1002000000021220ULL,
 0x80100850108048ULL,
 0xa40031b0235054ULL,
 0x8000000080120285ULL,
 0x6000010480409412ULL,
 0xc8200000203114ULL,
 0x8201000a42201002ULL,
 0x16040930500031ULL,
 0x9814002060000d63ULL,
 0x100058250220240ULL,
 0x360242603080020ULL,
 0x1008828064000a02ULL,
 0x2008000541112001ULL,
 0x80eba5005a24020dULL,
 0x8000018848000a6ULL,
 0x1a8000002000001ULL,
 0x80180000001001ULL,
 0x800c00100000008ULL,
 0x48074a006200428ULL,
 0x90100003280080ULL,
 0x8004000020802409ULL,
 0xc02221308041892ULL,
 0x30900a0508038025ULL,
 0xa80000028100210dULL,
 0xa00000100001203ULL,
 0x40004c28000200ULL,
 0x508800012a200ULL,
 0x4000082200a0208ULL,
 0x4002010001000408ULL,
 0x2080342002001820ULL,
 0x8000008c0448200ULL,
 0x212001200002014ULL,
 0x2809006940088021ULL,
 0x4481401081050ULL,
 0x120102028120ULL,
 0x10420a04831250ULL,
 0x102400610140a121ULL,
 0x1005105000002204ULL,
 0x1402080100000501ULL,
 0x4018000180201011ULL,
 0x501c0810001040cULL,
 0x880c010000100488ULL,
 0x902480019080001ULL,
 0x80404300010200ULL,
 0x8208000004808008ULL,
 0x4c02040ca00106ULL,
 0x6828000600a80806ULL,
 0x208008060080029ULL,
 0x200200ac00411a4ULL,
 0x65004000010048dULL,
 0x242008080042ULL,
 0x106040131000ULL,
 0x802000060028a008ULL,
 0x2002000410900203ULL,
 0x4288c00440010202ULL,
 0x4280880084801ULL,
 0x10100001401601ULL,
 0x6082000001602040ULL,
 0x20001082010820ULL,
 0xa2400100028426ULL,
 0x435000004402ULL,
 0x285006000004020aULL,
 0x240000000b14411ULL,
 0x208000000808003ULL
};

const uint64 BMagic[64] = {
 0x4000098218400011ULL,
 0x1144080004202601ULL,
 0x18400020008221ULL,
 0xa041421200082041ULL,
 0x4810128810110201ULL,
 0x2108050c001210ULL,
 0x410020b0434421ULL,
 0x800043181019804ULL,
 0x100002401434804ULL,
 0x902012000421642ULL,
 0x1002040016301248ULL,
 0x1000040460212009ULL,
 0x808c0004a2020882ULL,
 0x840006a280010ULL,
 0x8000120001084601ULL,
 0x3902440300900084ULL,
 0x2001910200068801ULL,
 0x2140014208234804ULL,
 0x4018050a005008ULL,
 0x80108a0401080001ULL,
 0x50080000a081102ULL,
 0x10240c4806000281ULL,
 0x8001020591900401ULL,
 0x8003042840002525ULL,
 0x1000a40099305018ULL,
 0x40000800041010a0ULL,
 0x481040209080ULL,
 0x10000201c006bULL,
 0x24008206040ULL,
 0x30014400000404a0ULL,
 0x404810000201110ULL,
 0x82400680928ULL,
 0x4020222814040540ULL,
 0x1200020100200870ULL,
 0x112008118044002ULL,
 0x4088180402088414ULL,
 0x404400000002045ULL,
 0x5000190080009402ULL,
 0x88204000045003ULL,
 0x504104440401109ULL,
 0x2000641000402804ULL,
 0x60050000c042032ULL,
 0x1148080010000908ULL,
 0x4062b08a4002ULL,
 0x10220140dULL,
 0xa00a102508048ULL,
 0x82000104009c0114ULL,
 0x8004a88020104ULL,
 0x814120508014001ULL,
 0x80040112310244ULL,
 0x48c102492000a04ULL,
 0x41802008004c001ULL,
 0x1ca00011030ULL,
 0x204200004c81041ULL,
 0x2000049860200112ULL,
 0x1021108070020aULL,
 0x100444a02920ccULL,
 0x4801040500804101ULL,
 0x120c2540001ULL,
 0x4000488020b2000ULL,
 0xa010800040029200ULL,
 0x1400054004203ULL,
 0x8210012880038008ULL,
 0x1202029054045010ULL
};

const uint64 RShifts[64] = {
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52
};

const uint64 BShifts[64] = {
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52,
 52, 52, 52, 52, 52, 52, 52, 52
};

Took 0.064932 seconds

======================================
User avatar
Evert
Posts: 2929
Joined: Sat Jan 22, 2011 12:42 am
Location: NL

Re: Are these set of magics correct?

Post by Evert »

Why don't you try them out and find out?
User avatar
vittyvirus
Posts: 646
Joined: Wed Jun 18, 2014 2:30 pm
Full name: Fahad Syed

Re: Are these set of magics correct?

Post by vittyvirus »

Evert wrote:Why don't you try them out and find out?
I'm no expert in magics, infact I've used Pradu's magicmoves.c in Yaka. I find HQ more interesting. I just throught this might help people here.
User avatar
Evert
Posts: 2929
Joined: Sat Jan 22, 2011 12:42 am
Location: NL

Re: Are these set of magics correct?

Post by Evert »

Well, I'm personally not overly interested in magic move generation anyway, and less so in how to generate them as quickly as possible (it's a generate once and use'm deal), but I'll say this: you'll get more people interested if you can show yourself that your code is correct.

This should not be hard: just plug it into a move generator and test it. You can do that by hand for a few occupancy states and then using good old perft (or you can skip the first step and go straight for perft, if you prefer that).
Sven
Posts: 4052
Joined: Thu May 15, 2008 9:57 pm
Location: Berlin, Germany
Full name: Sven Schüle

Re: Are these set of magics correct?

Post by Sven »

vittyvirus wrote:Be sure to have a look at RShift and BShift before testing these magics.

Are these correct?
I'm afraid they aren't. I tested most of them with my MagicChecker class (based on code from Tord Romstad's magic number generator). All rook magics from shift=58 down to 54 were flagged as incorrect. All bishop magics for shift=58 and 57 and most bishop magics for shift=56 down to 54 were flagged as incorrect as well. To get this result I replaced some ASSERT's by printf's. I did not analyze shift=53 and 52. For bishops 53 and 52 must be wrong in my opinion.

Find below a snippet that shows how my MagicChecker is implemented. You can easily figure out the missing parts.

I suggest that you add some DEBUG code into your version of the magic generator that lets you check immediately whether a generated magic number is valid or not. I have not checked the generator code that Matthew and you published recently but I suspect that you somehow missed that validation step, or maybe you have some bug in it.

I also suggest that you never focus on speed (e.g., fastest magic number generator) before you are really sure that your code is functionally correct.

Code: Select all

/*
 * The following code is derived from Tord Romstad's magic number generator which is publicly available
 * in the chess programming wiki (https://chessprogramming.wikispaces.com/Looking+for+Magics).
 *
 * Modifications by Sven Schuele, Berlin, 2014
 *
 * The original code by Tord Romstad contains validation code (mostly in function find_magic()) that has been
 * extracted into a C++ class "MagicChecker". It should be trivial to understand. Usage example:
 *
 * for &#40;unsigned int sqr = 0; sqr < 64; sqr++) &#123;
 *     MagicChecker rookChecker  &#40;sqr, false&#41;;
 *     MagicChecker bishopChecker&#40;sqr, true&#41;;
 *     assert&#40;rookChecker  .check&#40;RMagic&#91;sqr&#93;, 64 - RShift&#91;sqr&#93;));
 *     assert&#40;bishopChecker.check&#40;BMagic&#91;sqr&#93;, 64 - BShift&#91;sqr&#93;));
 * &#125;
 *
 * Note&#58; The code snippet below DOES NOT COMPILE without extending it.
 * Some internal functions have been left out here, they can easily be added by reading carefully ...
 */

class MagicChecker &#123;
public&#58;
    uint64 mask&#40;) const &#123; return mask; &#125;
    uint nBitsOfMask&#40;) const &#123; return nBitsOfMask; &#125;
    MagicChecker&#40;uint sqr, bool isBishop&#41;;
    bool check&#40;uint64 magic, uint maxNBits&#41;;

private&#58;
    bool magicWorksForSquare&#40;uint64 magic, uint nBitsAvailable, uint64 used&#91;&#93;);

    uint64 block      &#91;4096&#93;;
    uint64 attackSet  &#91;4096&#93;;
    uint64 mask;
    uint   nBitsOfMask;
&#125;;

MagicChecker&#58;&#58;MagicChecker&#40;uint sqr, bool isBishop&#41;
&#123;
    assert&#40;sqr <= H8&#41;;

    mask = isBishop? bishopMask&#40;sqr&#41; &#58; rookMask&#40;sqr&#41;;
    nBitsOfMask = popCount64&#40;mask&#41;;
    assert&#40;&#40;1U << nBitsOfMask&#41; <= 4096&#41;;

    for &#40;uint i = 0; i < &#40;1U << nBitsOfMask&#41;; i++) &#123;
        block&#91;i&#93; = indexToUInt64&#40;i, nBitsOfMask, mask&#41;;
        attackSet&#91;i&#93; = isBishop? bishopAttacks&#40;sqr, block&#91;i&#93;) &#58; rookAttacks&#40;sqr, block&#91;i&#93;);
    &#125;
&#125;

bool MagicChecker&#58;&#58;magicWorksForSquare&#40;
    uint64 magic,
    uint nBitsAvailable,
    uint64 used&#91;&#93;)
&#123;
    bool isFailed = false;

    // find out whether this magic number "works" for current square with available number of bits
    for &#40;uint i = 0; !isFailed && i < &#40;1U << nBitsOfMask&#41;; i++) &#123;
        uint attackSetIndex = transform&#40;block&#91;i&#93;, magic, nBitsAvailable&#41;;
        assert&#40;attackSetIndex < &#40;1U << nBitsAvailable&#41;);

        if &#40;used&#91;attackSetIndex&#93; == 0&#41; &#123;
            used&#91;attackSetIndex&#93; = attackSet&#91;i&#93;;
        &#125; else
        if &#40;used&#91;attackSetIndex&#93; != attackSet&#91;i&#93;) &#123;
            // magic does not work with this number of bits => terminate inner + outer loop
            isFailed = true;
        &#125;
    &#125;

    return !isFailed;
&#125;

bool MagicChecker&#58;&#58;check&#40;
    uint64 magic,
    uint maxNBits&#41;
&#123;
    assert&#40;&#40;1 << maxNBits&#41; <= 4096&#41;;

    uint nBitsAvailable = maxNBits;
    uint64 used&#91;4096&#93;;
    for &#40;uint idx = 0; idx < &#40;1U << nBitsAvailable&#41;; idx++) &#123;
        used&#91;idx&#93; = 0;
    &#125;

    return magicWorksForSquare&#40;magic, nBitsAvailable, used&#41;;
&#125;