diff --git a/goldenposeidon/constants.go b/goldenposeidon/constants.go index 1a952c4..3a979d2 100644 --- a/goldenposeidon/constants.go +++ b/goldenposeidon/constants.go @@ -14,102 +14,814 @@ var ( mdiag = []uint64{8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} c = []uint64{ - 0xb585f766f2144405, 0x7746a55f43921ad7, 0xb2fb0d31cee799b4, 0x0f6760a4803427d7, - 0xe10d666650f4e012, 0x8cae14cb07d09bf1, 0xd438539c95f63e9f, 0xef781c7ce35b4c3d, - 0xcdc4a239b0c44426, 0x277fa208bf337bff, 0xe17653a29da578a1, 0xc54302f225db2c76, - 0x86287821f722c881, 0x59cd1a8a41c18e55, 0xc3b919ad495dc574, 0xa484c4c5ef6a0781, - 0x308bbd23dc5416cc, 0x6e4a40c18f30c09c, 0x9a2eedb70d8f8cfa, 0xe360c6e0ae486f38, - 0xd5c7718fbfc647fb, 0xc35eae071903ff0b, 0x849c2656969c4be7, 0xc0572c8c08cbbbad, - 0xe9fa634a21de0082, 0xf56f6d48959a600d, 0xf7d713e806391165, 0x8297132b32825daf, - 0xad6805e0e30b2c8a, 0xac51d9f5fcf8535e, 0x502ad7dc18c2ad87, 0x57a1550c110b3041, - 0x66bbd30e6ce0e583, 0x0da2abef589d644e, 0xf061274fdb150d61, 0x28b8ec3ae9c29633, - 0x92a756e67e2b9413, 0x70e741ebfee96586, 0x019d5ee2af82ec1c, 0x6f6f2ed772466352, - 0x7cf416cfe7e14ca1, 0x61df517b86a46439, 0x85dc499b11d77b75, 0x4b959b48b9c10733, - 0xe8be3e5da8043e57, 0xf5c0bc1de6da8699, 0x40b12cbf09ef74bf, 0xa637093ecb2ad631, - 0x3cc3f892184df408, 0x2e479dc157bf31bb, 0x6f49de07a6234346, 0x213ce7bede378d7b, - 0x5b0431345d4dea83, 0xa2de45780344d6a1, 0x7103aaf94a7bf308, 0x5326fc0d97279301, - 0xa9ceb74fec024747, 0x27f8ec88bb21b1a3, 0xfceb4fda1ded0893, 0xfac6ff1346a41675, - 0x7131aa45268d7d8c, 0x9351036095630f9f, 0xad535b24afc26bfb, 0x4627f5c6993e44be, - 0x645cf794b8f1cc58, 0x241c70ed0af61617, 0xacb8e076647905f1, 0x3737e9db4c4f474d, - 0xe7ea5e33e75fffb6, 0x90dee49fc9bfc23a, 0xd1b1edf76bc09c92, 0x0b65481ba645c602, - 0x99ad1aab0814283b, 0x438a7c91d416ca4d, 0xb60de3bcc5ea751c, 0xc99cab6aef6f58bc, - 0x69a5ed92a72ee4ff, 0x5e7b329c1ed4ad71, 0x5fc0ac0800144885, 0x32db829239774eca, - 0x0ade699c5830f310, 0x7cc5583b10415f21, 0x85df9ed2e166d64f, 0x6604df4fee32bcb1, - 0xeb84f608da56ef48, 0xda608834c40e603d, 0x8f97fe408061f183, 0xa93f485c96f37b89, - 0x6704e8ee8f18d563, 0xcee3e9ac1e072119, 0x510d0e65e2b470c1, 0xf6323f486b9038f0, - 0x0b508cdeffa5ceef, 0xf2417089e4fb3cbd, 0x60e75c2890d15730, 0xa6217d8bf660f29c, - 0x7159cd30c3ac118e, 0x839b4e8fafead540, 0x0d3f3e5e82920adc, 0x8f7d83bddee7bba8, - 0x780f2243ea071d06, 0xeb915845f3de1634, 0xd19e120d26b6f386, 0x016ee53a7e5fecc6, - 0xcb5fd54e7933e477, 0xacb8417879fd449f, 0x9c22190be7f74732, 0x5d693c1ba3ba3621, - 0xdcef0797c2b69ec7, 0x3d639263da827b13, 0xe273fd971bc8d0e7, 0x418f02702d227ed5, - 0x8c25fda3b503038c, 0x2cbaed4daec8c07c, 0x5f58e6afcdd6ddc2, 0x284650ac5e1b0eba, - 0x635b337ee819dab5, 0x9f9a036ed4f2d49f, 0xb93e260cae5c170e, 0xb0a7eae879ddb76d, - 0xd0762cbc8ca6570c, 0x34c6efb812b04bf5, 0x40bf0ab5fa14c112, 0xb6b570fc7c5740d3, - 0x5a27b9002de33454, 0xb1a5b165b6d2b2d2, 0x8722e0ace9d1be22, 0x788ee3b37e5680fb, - 0x14a726661551e284, 0x98b7672f9ef3b419, 0xbb93ae776bb30e3a, 0x28fd3b046380f850, - 0x30a4680593258387, 0x337dc00c61bd9ce1, 0xd5eca244c7a4ff1d, 0x7762638264d279bd, - 0xc1e434bedeefd767, 0x0299351a53b8ec22, 0xb2d456e4ad251b80, 0x3e9ed1fda49cea0b, - 0x2972a92ba450bed8, 0x20216dd77be493de, 0xadffe8cf28449ec6, 0x1c4dbb1c4c27d243, - 0x15a16a8a8322d458, 0x388a128b7fd9a609, 0x2300e5d6baedf0fb, 0x2f63aa8647e15104, - 0xf1c36ce86ecec269, 0x27181125183970c9, 0xe584029370dca96d, 0x4d9bbc3e02f1cfb2, - 0xea35bc29692af6f8, 0x18e21b4beabb4137, 0x1e3b9fc625b554f4, 0x25d64362697828fd, - 0x5a3f1bb1c53a9645, 0xdb7f023869fb8d38, 0xb462065911d4e1fc, 0x49c24ae4437d8030, - 0xd793862c112b0566, 0xaadd1106730d8feb, 0xc43b6e0e97b0d568, 0xe29024c18ee6fca2, - 0x5e50c27535b88c66, 0x10383f20a4ff9a87, 0x38e8ee9d71a45af8, 0xdd5118375bf1a9b9, - 0x775005982d74d7f7, 0x86ab99b4dde6c8b0, 0xb1204f603f51c080, 0xef61ac8470250ecf, - 0x1bbcd90f132c603f, 0x0cd1dabd964db557, 0x11a3ae5beb9d1ec9, 0xf755bfeea585d11d, - 0xa3b83250268ea4d7, 0x516306f4927c93af, 0xddb4ac49c9efa1da, 0x64bb6dec369d4418, - 0xf9cc95c22b4c1fcc, 0x08d37f755f4ae9f6, 0xeec49b613478675b, 0xf143933aed25e0b0, - 0xe4c5dd8255dfc622, 0xe7ad7756f193198e, 0x92c2318b87fff9cb, 0x739c25f8fd73596d, - 0x5636cac9f16dfed0, 0xdd8f909a938e0172, 0xc6401fe115063f5b, 0x8ad97b33f1ac1455, - 0x0c49366bb25e8513, 0x0784d3d2f1698309, 0x530fb67ea1809a81, 0x410492299bb01f49, - 0x139542347424b9ac, 0x9cb0bd5ea1a1115e, 0x02e3f615c38f49a1, 0x985d4f4a9c5291ef, - 0x775b9feafdcd26e7, 0x304265a6384f0f2d, 0x593664c39773012c, 0x4f0a2e5fb028f2ce, - 0xdd611f1000c17442, 0xd8185f9adfea4fd0, 0xef87139ca9a3ab1e, 0x3ba71336c34ee133, - 0x7d3a455d56b70238, 0x660d32e130182684, 0x297a863f48cd1f43, 0x90e0a736a751ebb7, - 0x549f80ce550c4fd3, 0x0f73b2922f38bd64, 0x16bf1f73fb7a9c3f, 0x6d1f5a59005bec17, - 0x02ff876fa5ef97c4, 0xc5cb72a2a51159b0, 0x8470f39d2d5c900e, 0x25abb3f1d39fcb76, - 0x23eb8cc9b372442f, 0xd687ba55c64f6364, 0xda8d9e90fd8ff158, 0xe3cbdc7d2fe45ea7, - 0xb9a8c9b3aee52297, 0xc0d28a5c10960bd3, 0x45d7ac9b68f71a34, 0xeeb76e397069e804, - 0x3d06c8bd1514e2d9, 0x9c9c98207cb10767, 0x65700b51aedfb5ef, 0x911f451539869408, - 0x7ae6849fbc3a0ec6, 0x3bb340eba06afe7e, 0xb46e9d8b682ea65e, 0x8dcf22f9a3b34356, - 0x77bdaeda586257a7, 0xf19e400a5104d20d, 0xc368a348e46d950f, 0x9ef1cd60e679f284, - 0xe89cd854d5d01d33, 0x5cd377dc8bb882a2, 0xa7b0fb7883eee860, 0x7684403ec392950d, - 0x5fa3f06f4fed3b52, 0x8df57ac11bc04831, 0x2db01efa1e1e1897, 0x54846de4aadb9ca2, - 0xba6745385893c784, 0x541d496344d2c75b, 0xe909678474e687fe, 0xdfe89923f6c9c2ff, - 0xece5a71e0cfedc75, 0x5ff98fd5d51fe610, 0x83e8941918964615, 0x5922040b47f150c1, - 0xf97d750e3dd94521, 0x5080d4c2b86f56d7, 0xa7de115b56c78d70, 0x6a9242ac87538194, - 0xf7856ef7f9173e44, 0x2265fc92feb0dc09, 0x17dfc8e4f7ba8a57, 0x9001a64209f21db8, - 0x90004c1371b893c5, 0xb932b7cf752e5545, 0xa0b1df81b6fe59fc, 0x8ef1dd26770af2c2, - 0x0541a4f9cfbeed35, 0x9e61106178bfc530, 0xb3767e80935d8af2, 0x0098d5782065af06, - 0x31d191cd5c1466c7, 0x410fefafa319ac9d, 0xbdf8f242e316c4ab, 0x9e8cd55b57637ed0, - 0xde122bebe9a39368, 0x4d001fd58f002526, 0xca6637000eb4a9f8, 0x2f2339d624f91f78, - 0x6d1a7918c80df518, 0xdf9a4939342308e9, 0xebc2151ee6c8398c, 0x03cc2ba8a1116515, - 0xd341d037e840cf83, 0x387cb5d25af4afcc, 0xbba2515f22909e87, 0x7248fe7705f38e47, - 0x4d61e56a525d225a, 0x262e963c8da05d3d, 0x59e89b094d220ec2, 0x055d5b52b78b9c5e, - 0x82b27eb33514ef99, 0xd30094ca96b7ce7b, 0xcf5cb381cd0a1535, 0xfeed4db6919e5a7c, - 0x41703f53753be59f, 0x5eeea940fcde8b6f, 0x4cd1f1b175100206, 0x4a20358574454ec0, - 0x1478d361dbbf9fac, 0x6f02dc07d141875c, 0x296a202ed8e556a2, 0x2afd67999bf32ee5, - 0x7acfd96efa95491d, 0x6798ba0c0abb2c6d, 0x34c6f57b26c92122, 0x5736e1bad206b5de, - 0x20057d2a0056521b, 0x3dea5bd5d0578bd7, 0x16e50d897d4634ac, 0x29bff3ecb9b7a6e3, - 0x475cd3205a3bdcde, 0x18a42105c31b7e88, 0x023e7414af663068, 0x15147108121967d7, - 0xe4a3dff1d7d6fef9, 0x01a8d1a588085737, 0x11b4c74eda62beef, 0xe587cc0d69a73346, - 0x1ff7327017aa2a6e, 0x594e29c42473d06b, 0xf6f31db1899b12d5, 0xc02ac5e47312d3ca, - 0xe70201e960cb78b8, 0x6f90ff3b6a65f108, 0x42747a7245e7fa84, 0xd1f507e43ab749b2, - 0x1c86d265f15750cd, 0x3996ce73dd832c1c, 0x8e7fba02983224bd, 0xba0dec7103255dd4, - 0x9e9cbd781628fc5b, 0xdae8645996edd6a5, 0xdebe0853b1a1d378, 0xa49229d24d014343, - 0x7be5b9ffda905e1c, 0xa3c95eaec244aa30, 0x0230bca8f4df0544, 0x4135c2bebfe148c6, - 0x166fc0cc438a3c72, 0x3762b59a8ae83efa, 0xe8928a4c89114750, 0x2a440b51a4945ee5, - 0x80cefd2b7d99ff83, 0xbb9879c6e61fd62a, 0x6e7c8f1a84265034, 0x164bb2de1bbeddc8, - 0xf3c12fe54d5c653b, 0x40b9e922ed9771e2, 0x551f5b0fbe7b1840, 0x25032aa7c4cb1811, - 0xaaed34074b164346, 0x8ffd96bbf9c9c81d, 0x70fc91eb5937085c, 0x7f795e2a5f915440, - 0x4543d9df5476d3cb, 0xf172d73e004fc90d, 0xdfd1c4febcc81238, 0xbc8dfb627fe558fc, + 0xb585f766f2144405, + 0x7746a55f43921ad7, + 0xb2fb0d31cee799b4, + 0xf6760a4803427d7, + 0xe10d666650f4e012, + 0x8cae14cb07d09bf1, + 0xd438539c95f63e9f, + 0xef781c7ce35b4c3d, + 0xcdc4a239b0c44426, + 0x277fa208bf337bff, + 0xe17653a29da578a1, + 0xc54302f225db2c76, + 0xac6c9c2b4418dd61, + 0xe0888eb1e8a01286, + 0x813dbe952b98904e, + 0xcc3033609c9cf175, + 0x72cebc82a59c0f82, + 0x8150d8525753e741, + 0xb1122c74b268d66e, + 0x7c6ddd482375aa2, + 0xa4dd6f1ef49fb6af, + 0xd33b0d5b4f7ccfe5, + 0xc523112247209124, + 0x464804200134c32d, + 0xcd09dea180de4f2c, + 0xadb069225c93e4e6, + 0xbf01209b8a7c8534, + 0xb1eb37d319913823, + 0xdadf943b8d3e5a0d, + 0x6d15f3cb7a3520ba, + 0xf07af62b134ef181, + 0x568355076c6b0de6, + 0x31ca4bf93cab68b8, + 0xfbad37a125735ba, + 0x9d3a9caaf1ac9e0a, + 0x4f265810f020c095, + 0x6a84c9524e81a8bc, + 0x68ba410537925c79, + 0x422604631b34b07a, + 0x28e3a001f62f8290, + 0x3adfdccb8f734d41, + 0x73503e539baec66a, + 0xe8c1fd0142d9849c, + 0xe204ac13660546c5, + 0x8e2bb3ea97a40c53, + 0xac2800d1bf56548c, + 0x9494dca005d180d0, + 0xf36e1d066383ef53, + 0x8aa35b97a0e03c04, + 0xcf42a59addbd1f0c, + 0xa43ace89f8fdbd79, + 0x37585d8c243870c, + 0x4ab94ee3e26596fe, + 0xcee3abbb50d57b23, + 0xac91a7101a5ec55b, + 0x9173aa8462280d2d, + 0xaec1ca46ccb95105, + 0x57b2f2845db61e4a, + 0x95704158500c90c6, + 0x66e023b0e6c9df5f, + 0x315f63f4fec360ba, + 0xf3009795713abcf1, + 0xf4decc3fb00765ee, + 0x32620ac918682d50, + 0x49717d63a5fc742e, + 0x153516f22014ea2d, + 0xcc316380a2761fe4, + 0x2e49b3f7076d203d, + 0x44ac3e9bf0a2dc89, + 0x49d1e388d8e35c, + 0x53ec867cb39989fa, + 0xd2c9bcc8d65f5a62, + 0xc0cc930ee8540455, + 0x40651e0872505e8, + 0x168973b2ebafbe6c, + 0x9c7eecb3b40581c2, + 0x389473bcdfca97a2, + 0xb1cb0b3abe9753ad, + 0x41afceccffdb18e6, + 0x7bf841e237ccd6c9, + 0x6082a3f101fb888, + 0x8c1a39196f4163cc, + 0xb56664760c1c9476, + 0x2a02ac020d1eb5a3, + 0x6a9d48e8aa83605d, + 0x8a0d2f5c4c9c51b2, + 0x75fc65575b284ad4, + 0xadaedf7d1ce2a8dd, + 0x235bc889cc83968e, + 0xa8c30cf1781738f5, + 0x546b2a846753bcf8, + 0x9b68e8c06c04bd25, + 0x3fdf80794ebb443b, + 0x92ca132a9bec5a45, + 0x76133eecfd9bd1ff, + 0x3fb0fd5381054812, + 0xf15925978dbd52ff, + 0x2ee289ac37f0e879, + 0xd8af8654e9a2e659, + 0x8595bbd7f34c5e8a, + 0x206ddbf781e47b2, + 0xe101a767854a2f97, + 0xf4d4f0a01072c996, + 0x197aec2894aab642, + 0x8d0c3911220db49b, + 0xa62a8bad609227ca, + 0x1e4813a7e7b9cbce, + 0x6b547528731244eb, + 0xd08e48512bfea84e, + 0xb2920c88d3885857, + 0x1f0cd5d7a309fcc2, + 0x99a0ea0842fdb4fb, + 0xc227210554b6c53d, + 0x70e5269708f6f3a9, + 0xbe8f71c8c98bb3bd, + 0xf96fb39adc4baaf6, + 0x7f9a7555c60fc6c7, + 0xccaa5446d71fe6a5, + } + + p = [][]uint64{ + { + 0x19, + 0x78566230aa7cc5d0, + 0xdbf23e50005e7f24, + 0xb4a02c5c826d523e, + 0x466d8f66a8f9fed5, + 0x68da2264f65ec3e, + 0xb59f9ff0ac6d5d78, + 0xcfb03c902d447551, + 0x2044ce14eaf8f5d9, + 0xfb9373c8481e0f0d, + 0x72af70cdcb99214f, + 0xe3ef40eacc6ff78d, + }, + { + 0xf, + 0x817bd8a7869ed1b5, + 0x819f2c14a8366b1f, + 0x7a5cf5b7b922e946, + 0x727eca45c8d7bb71, + 0x605a82c52b5ad2f1, + 0x59ccc4d5184bc93a, + 0x66c8bab2096cfd38, + 0xeb4c0ce280c3e935, + 0x17f9202c16676b2f, + 0x9b6e5164ed35d878, + 0x6fadc9347faeee81, + }, + { + 0x29, + 0xd267254bea1097f4, + 0x2dc10fce3233f443, + 0xfa9db0de2d852e7a, + 0xde2a0516f8c9d943, + 0xe6fdf23648931b99, + 0x3743057c07a5dbfa, + 0xa6fdb8ebccc51667, + 0x2c4916605e3dea58, + 0xe95c10ae32e05085, + 0x97f9b7d2cfc2ade5, + 0x9b6e5164ed35d878, + }, + { + 0x10, + 0x60c33ebd1e023f0a, + 0xdb6945a20d277091, + 0x383dd77e07998487, + 0xe04ea1957ad8305c, + 0xd499fcbf63fbd266, + 0x462269e4b04620a5, + 0x63c9679d8572a867, + 0x81c44e9699915693, + 0x62ecbe05e02433fc, + 0xe95c10ae32e05085, + 0x17f9202c16676b2f, + }, + { + 0x2, + 0xa89ef32ae1462322, + 0x77c1a153e73659e8, + 0x2aec981be4b62ed5, + 0xb70fb5f2b4f1f85f, + 0x7c66d474cd2087cb, + 0x39302966be7df654, + 0xb827c807875511c0, + 0xa4daffb3ffd0e78f, + 0x81c44e9699915693, + 0x2c4916605e3dea58, + 0xeb4c0ce280c3e935, + }, + { + 0x1c, + 0x6250f5f176d483e7, + 0xaad1255d46e78f07, + 0x8a00c7c83c762584, + 0xc734f3829ed30b0c, + 0xb1a0132288b1619b, + 0x88685b4f0798dfd1, + 0xfc02e869e21b72f8, + 0xb827c807875511c0, + 0x63c9679d8572a867, + 0xa6fdb8ebccc51667, + 0x66c8bab2096cfd38, + }, + { + 0xd, + 0xe16a6c1dee3ba347, + 0x13d316e45539aef4, + 0x577e0472764f061d, + 0x226a4dcf5db3316d, + 0x3373035a3ca3dac6, + 0x441f3a3747b5adb7, + 0x88685b4f0798dfd1, + 0x39302966be7df654, + 0x462269e4b04620a5, + 0x3743057c07a5dbfa, + 0x59ccc4d5184bc93a, + }, + { + 0xd, + 0xec9730136b7c2c05, + 0xe1ecc5c21eec0646, + 0x956d3c8b5528e064, + 0x6df1d31fa84398f4, + 0xf4898a1a3554ee49, + 0x3373035a3ca3dac6, + 0xb1a0132288b1619b, + 0x7c66d474cd2087cb, + 0xd499fcbf63fbd266, + 0xe6fdf23648931b99, + 0x605a82c52b5ad2f1, + }, + { + 0x27, + 0x3cf7c3a39d94c236, + 0x9e62c7d7b000cb0b, + 0xe202be7ad7265af6, + 0x82178371fa5fff69, + 0x6df1d31fa84398f4, + 0x226a4dcf5db3316d, + 0xc734f3829ed30b0c, + 0xb70fb5f2b4f1f85f, + 0xe04ea1957ad8305c, + 0xde2a0516f8c9d943, + 0x727eca45c8d7bb71, + }, + { + 0x12, + 0xb4707207455f57e3, + 0x8e1de42b665c6706, + 0xee7b04568203481, + 0xe202be7ad7265af6, + 0x956d3c8b5528e064, + 0x577e0472764f061d, + 0x8a00c7c83c762584, + 0x2aec981be4b62ed5, + 0x383dd77e07998487, + 0xfa9db0de2d852e7a, + 0x7a5cf5b7b922e946, + }, + { + 0x22, + 0xaadb39e83e76a9e0, + 0xcd9bf0bd292c5fda, + 0x8e1de42b665c6706, + 0x9e62c7d7b000cb0b, + 0xe1ecc5c21eec0646, + 0x13d316e45539aef4, + 0xaad1255d46e78f07, + 0x77c1a153e73659e8, + 0xdb6945a20d277091, + 0x2dc10fce3233f443, + 0x819f2c14a8366b1f, + }, + { + 0x14, + 0x32f8ae916e567d39, + 0xaadb39e83e76a9e0, + 0xb4707207455f57e3, + 0x3cf7c3a39d94c236, + 0xec9730136b7c2c05, + 0xe16a6c1dee3ba347, + 0x6250f5f176d483e7, + 0xa89ef32ae1462322, + 0x60c33ebd1e023f0a, + 0xd267254bea1097f4, + 0x817bd8a7869ed1b5, + }, + } + + s = []uint64{ + 0x19, + 0x3d999c961b7c63b0, + 0x814e82efcd172529, + 0x2421e5d236704588, + 0x887af7d4dd482328, + 0xa5e9c291f6119b27, + 0xbdc52b2676a4b4aa, + 0x64832009d29bcf57, + 0x9c4155174a552cc, + 0x463f9ee03d290810, + 0xc810936e64982542, + 0x43b1c289f7bc3ac, + 0x94877900674181c3, + 0xc6c67cc37a2a2bbd, + 0xd667c2055387940f, + 0xba63a63e94b5ff0, + 0x99460cc41b8f079f, + 0x7ff02375ed524bb3, + 0xea0870b47a8caf0e, + 0xabcad82633b7bc9d, + 0x3b8d135261052241, + 0xfb4515f5e5b0d539, + 0x3ee8011c2b37f77c, + 0x19, + 0x673655aae8be5a8b, + 0xd510fe714f39fa10, + 0x2c68a099b51c9e73, + 0xa667bfa9aa96999d, + 0x4d67e72f063e2108, + 0xf84dde3e6acda179, + 0x40f9cc8c08f80981, + 0x5ead032050097142, + 0x6591b02092d671bb, + 0xe18c71963dd1b7, + 0x8a21bcd24a14218a, + 0xadef3740e71c726, + 0xa37bf67c6f986559, + 0xc6b16f7ed4fa1b00, + 0x6a065da88d8bfc3c, + 0x4cabc0916844b46f, + 0x407faac0f02e78d1, + 0x7a786d9cf0852cf, + 0x42433fb6949a629a, + 0x891682a147ce43b0, + 0x26cfd58e7b003b55, + 0x2bbf0ed7b657acb3, + 0x19, + 0x202800f4addbdc87, + 0xe4b5bdb1cc3504ff, + 0xbe32b32a825596e7, + 0x8e0f68c5dc223b9a, + 0x58022d9e1c256ce3, + 0x584d29227aa073ac, + 0x8b9352ad04bef9e7, + 0xaead42a3f445ecbf, + 0x3c667a1d833a3cca, + 0xda6f61838efa1ffe, + 0xe8f749470bd7c446, + 0x481ac7746b159c67, + 0xe367de32f108e278, + 0x73f260087ad28bec, + 0x5cfc82216bc1bdca, + 0xcaccc870a2663a0e, + 0xdb69cd7b4298c45d, + 0x7bc9e0c57243e62d, + 0x3cc51c5d368693ae, + 0x366b4e8cc068895b, + 0x2bd18715cdabbca4, + 0xa752061c4f33b8cf, + 0x19, + 0xc5b85bab9e5b3869, + 0x45245258aec51cf7, + 0x16e6b8e68b931830, + 0xe2ae0f051418112c, + 0x470e26a0093a65b, + 0x6bef71973a8146ed, + 0x119265be51812daf, + 0xb0be7356254bea2e, + 0x8584defff7589bd7, + 0x3c5fe4aeb1fb52ba, + 0x9e7cd88acf543a5e, + 0xb22d2432b72d5098, + 0x9e18a487f44d2fe4, + 0x4b39e14ce22abd3c, + 0x9e77fde2eb315e0d, + 0xca5e0385fe67014d, + 0xc2cb99bf1b6bddb, + 0x99ec1cd2a4460bfe, + 0x8577a815a2ff843f, + 0x7d80a6b4fd6518a5, + 0xeb6c67123eab62cb, + 0x8f7851650eca21a5, + 0x19, + 0x179be4bba87f0a8c, + 0xacf63d95d8887355, + 0x6696670196b0074f, + 0xd99ddf1fe75085f9, + 0xc2597881fef0283b, + 0xcf48395ee6c54f14, + 0x15226a8e4cd8d3b6, + 0xc053297389af5d3b, + 0x2c08893f0d1580e2, + 0xed3cbcff6fcc5ba, + 0xc82f510ecf81f6d0, + 0x11ba9a1b81718c2a, + 0x9f7d798a3323410c, + 0xa821855c8c1cf5e5, + 0x535e8d6fac0031b2, + 0x404e7c751b634320, + 0xa729353f6e55d354, + 0x4db97d92e58bb831, + 0xb53926c27897bf7d, + 0x965040d52fe115c5, + 0x9565fa41ebd31fd7, + 0xaae4438c877ea8f4, + 0x19, + 0x94b06183acb715cc, + 0x500392ed0d431137, + 0x861cc95ad5c86323, + 0x5830a443f86c4ac, + 0x3b68225874a20a7c, + 0x10b3309838e236fb, + 0x9b77fc8bcd559e2c, + 0xbdecf5e0cb9cb213, + 0x30276f1221ace5fa, + 0x7935dd342764a144, + 0xeac6db520bb03708, + 0x37f4e36af6073c6e, + 0x4edc0918210800e9, + 0xc44998e99eae4188, + 0x9f4310d05d068338, + 0x9ec7fe4350680f29, + 0xc5b2c1fdc0b50874, + 0xa01920c5ef8b2ebe, + 0x59fa6f8bd91d58ba, + 0x8bfc9eb89b515a82, + 0xbe86a7a2555ae775, + 0xcbb8bbaa3810babf, + 0x19, + 0x7186a80551025f8f, + 0x622247557e9b5371, + 0xc4cbe326d1ad9742, + 0x55f1523ac6a23ea2, + 0xa13dfe77a3d52f53, + 0xe30750b6301c0452, + 0x8bd488070a3a32b, + 0xcd800caef5b72ae3, + 0x83329c90f04233ce, + 0xb5b99e6664a0a3ee, + 0x6b0731849e200a7f, + 0x577f9a9e7ee3f9c2, + 0x88c522b949ace7b1, + 0x82f07007c8b72106, + 0x8283d37c6675b50e, + 0x98b074d9bbac1123, + 0x75c56fb7758317c1, + 0xfed24e206052bc72, + 0x26d7c3d1bc07dae5, + 0xf88c5e441e28dbb4, + 0x4fe27f9f96615270, + 0x514d4ba49c2b14fe, + 0x19, + 0xec3fabc192b01799, + 0x382b38cee8ee5375, + 0x3bfb6c3f0e616572, + 0x514abd0cf6c7bc86, + 0x47521b1361dcc546, + 0x178093843f863d14, + 0xad1003c5d28918e7, + 0x738450e42495bc81, + 0xaf947c59af5e4047, + 0x4653fb0685084ef2, + 0x57fde2062ae35bf, + 0xf02a3ac068ee110b, + 0xa3630dafb8ae2d7, + 0xce0dc874eaf9b55c, + 0x9a95f6cff5b55c7e, + 0x626d76abfed00c7b, + 0xa0c1cf1251c204ad, + 0xdaebd3006321052c, + 0x3d4bd48b625a8065, + 0x7f1e584e071f6ed2, + 0x720574f0501caed3, + 0xe3260ba93d23540a, + 0x19, + 0xe376678d843ce55e, + 0x66f3860d7514e7fc, + 0x7817f3dfff8b4ffa, + 0x3929624a9def725b, + 0x126ca37f215a80a, + 0xfce2f5d02762a303, + 0x1bc927375febbad7, + 0x85b481e5243f60bf, + 0x2d3c5f42a39c91a0, + 0x811719919351ae8, + 0xf669de0add993131, + 0xab1cbd41d8c1e335, + 0x9322ed4c0bc2df01, + 0x51c3c0983d4284e5, + 0x94178e291145c231, + 0xfd0f1a973d6b2085, + 0xd427ad96e2b39719, + 0x8a52437fecaac06b, + 0xdc20ee4b8c4c9a80, + 0xa2c98e9549da2100, + 0x1603fe12613db5b6, + 0xe174929433c5505, + 0x19, + 0x7de38bae084da92d, + 0x5b848442237e8a9b, + 0xf6c705da84d57310, + 0x31e6a4bdb6a49017, + 0x889489706e5c5c0f, + 0xe4a205459692a1b, + 0xbac3fa75ee26f299, + 0x5f5894f4057d755e, + 0xb0dc3ecd724bb076, + 0x5e34d8554a6452ba, + 0x4f78fd8c1fdcc5f, + 0x3d4eab2b8ef5f796, + 0xcfff421583896e22, + 0x4143cb32d39ac3d9, + 0x22365051b78a5b65, + 0x6f7fd010d027c9b6, + 0xd9dd36fba77522ab, + 0xa44cf1cb33e37165, + 0x3fc83d3038c86417, + 0xc4588d418e88d270, + 0xce1320f10ab80fe2, + 0xdb5eadbbec18de5d, + 0x19, + 0x4dd19c38779512ea, + 0xdb79ba02704620e9, + 0x92a29a3675a5d2be, + 0xd5177029fe495166, + 0xd32b3298a13330c1, + 0x251c4a3eb2c5f8fd, + 0xe1c48b26e0d98825, + 0x3301d3362a4ffccb, + 0x9bb6c88de8cd178, + 0xdc05b676564f538a, + 0x60192d883e473fee, + 0x1183dfce7c454afd, + 0x21cea4aa3d3ed949, + 0xfce6f70303f2304, + 0x19557d34b55551be, + 0x4c56f689afc5bbc9, + 0xa1e920844334f944, + 0xbad66d423d2ec861, + 0xf318c785dc9e0479, + 0x99e2032e765ddd81, + 0x400ccc9906d66f45, + 0xe1197454db2e0dd9, + 0x19, + 0x16b9774801ac44a0, + 0x3cb8411e786d3c8e, + 0xa86e9cf505072491, + 0x178928152e109ae, + 0x5317b905a6e1ab7b, + 0xda20b3be7f53d59f, + 0xcb97dedecebee9ad, + 0x4bd545218c59f58d, + 0x77dc8d856c05a44a, + 0x87948589e4f243fd, + 0x7e5217af969952c2, + 0x84d1ecc4d53d2ff1, + 0xd8af8b9ceb4e11b6, + 0x335856bb527b52f4, + 0xc756f17fb59be595, + 0xc0654e4ea5553a78, + 0x9e9a46b61f2ea942, + 0x14fc8b5b3b809127, + 0xd7009f0f103be413, + 0x3e0ee7b7a9fb4601, + 0xa74e888922085ed7, + 0xe80a7cde3d4ac526, + 0x19, + 0xbc58987d06a84e4d, + 0xb5d420244c9cae3, + 0xa3c4711b938c02c0, + 0x3aace640a3e03990, + 0x865a0f3249aacd8a, + 0x8d00b2a7dbed06c7, + 0x6eacb905beb7e2f8, + 0x45322b216ec3ec7, + 0xeb9de00d594828e6, + 0x88c5f20df9e5c26, + 0xf555f4112b19781f, + 0x238aa6daa612186d, + 0x9137a5c630bad4b4, + 0xc7db3817870c5eda, + 0x217e4f04e5718dc9, + 0xcae814e2817bd99d, + 0xe3292e7ab770a8ba, + 0x7bb36ef70b6b9482, + 0x3c7835fb85bca2d3, + 0xfe2cdf8ee3c25e86, + 0x61b3915ad7274b20, + 0xeab75ca7c918e4ef, + 0x19, + 0xa8cedbff1813d3a7, + 0x50dcaee0fd27d164, + 0xf1cb02417e23bd82, + 0xfaf322786e2abe8b, + 0x937a4315beb5d9b6, + 0x1b18992921a11d85, + 0x7d66c4368b3c497b, + 0xe7946317a6b4e99, + 0xbe4430134182978b, + 0x3771e82493ab262d, + 0xa671690d8095ce82, + 0xd6e15ffc055e154e, + 0xec67881f381a32bf, + 0xfbb1196092bf409c, + 0xdc9d2e07830ba226, + 0x698ef3245ff7988, + 0x194fae2974f8b576, + 0x7a5d9bea6ca4910e, + 0x7aebfea95ccdd1c9, + 0xf9bd38a67d5f0e86, + 0xfa65539de65492d8, + 0xf0dfcbe7653ff787, + 0x19, + 0xb035585f6e929d9d, + 0xba1579c7e219b954, + 0xcb201cf846db4ba3, + 0x287bf9177372cf45, + 0xa350e4f61147d0a6, + 0xd5d0ecfb50bcff99, + 0x2e166aa6c776ed21, + 0xe1e66c991990e282, + 0x662b329b01e7bb38, + 0x8aa674b36144d9a9, + 0xcbabf78f97f95e65, + 0xbd87ad390420258, + 0xad8617bca9e33c8, + 0xc00ad377a1e2666, + 0xac6fc58b3f0518f, + 0xc0cc8a892cc4173, + 0xc210accb117bc21, + 0xb73630dbb46ca18, + 0xc8be4920cbd4a54, + 0xbfe877a21be1690, + 0xae790559b0ded81, + 0xbf50db2f8d6ce31, + 0x19, + 0xeec24b15a06b53fe, + 0xc8a7aa07c5633533, + 0xefe9c6fa4311ad51, + 0xb9173f13977109a1, + 0x69ce43c9cc94aedc, + 0xecf623c9cd118815, + 0x28625def198c33c7, + 0xccfc5f7de5c3636a, + 0xf5e6c40f1621c299, + 0xcec0e58c34cb64b1, + 0xa868ea113387939f, + 0xcf29427ff7c58, + 0xbd9b3cf49eec8, + 0xd1dc8aa81fb26, + 0xbc792d5c394ef, + 0xd2ae0b2266453, + 0xd413f12c496c1, + 0xc84128cfed618, + 0xdb5ebd48fc0d4, + 0xd1b77326dcb90, + 0xbeb0ccc145421, + 0xd10e5b22b11d1, + 0x19, + 0xd8dddbdc5ce4ef45, + 0xacfc51de8131458c, + 0x146bb3c0fe499ac0, + 0x9e65309f15943903, + 0x80d0ad980773aa70, + 0xf97817d4ddbf0607, + 0xe4626620a75ba276, + 0xdfdc7fd6fc74f66, + 0xf464864ad6f2bb93, + 0x2d55e52a5d44414, + 0xdd8de62487c40925, + 0xe24c99adad8, + 0xcf389ed4bc8, + 0xe580cbf6966, + 0xcde5fd7e04f, + 0xe63628041b3, + 0xe7e81a87361, + 0xdabe78f6d98, + 0xefb14cac554, + 0xe5574743b10, + 0xd05709f42c1, + 0xe4690c96af1, + 0x19, + 0xc15acf44759545a3, + 0xcbfdcf39869719d4, + 0x33f62042e2f80225, + 0x2599c5ead81d8fa3, + 0xb306cb6c1d7c8d0, + 0x658c80d3df3729b1, + 0xe8d1b2b21b41429c, + 0xa1b67f09d4b3ccb8, + 0xe1adf8b84437180, + 0xd593a5e584af47b, + 0xa023d94c56e151c7, + 0xf7157bc98, + 0xe3006d948, + 0xfa65811e6, + 0xe0d127e2f, + 0xfc18bfe53, + 0xfd002d901, + 0xeed6461d8, + 0x1068562754, + 0xfa0236f50, + 0xe3af13ee1, + 0xfa460f6d1, + 0x19, + 0x49026cc3a4afc5a6, + 0xe06dff00ab25b91b, + 0xab38c561e8850ff, + 0x92c3c8275e105eeb, + 0xb65256e546889bd0, + 0x3c0468236ea142f6, + 0xee61766b889e18f2, + 0xa206f41b12c30415, + 0x2fe9d756c9f12d1, + 0xe9633210630cbf12, + 0x1ffea9fe85a0b0b1, + 0x11131738, + 0xf56d588, + 0x11050f86, + 0xf848f4f, + 0x111527d3, + 0x114369a1, + 0x106f2f38, + 0x11e2ca94, + 0x110a29f0, + 0xfa9f5c1, + 0x10f625d1, + 0x19, + 0x81d1ae8cc50240f3, + 0xf4c77a079a4607d7, + 0xed446b2315e3efc1, + 0xb0a6b70915178c3, + 0xb11ff3e089f15d9a, + 0x1d4dba0b7ae9cc18, + 0x65d74e2f43b48d05, + 0xa2df8c6b8ae0804a, + 0xa4e6f0a8c33348a6, + 0xc0a26efc7be5669b, + 0xa6b6582c547d0d60, + 0x11f718, + 0x10b6c8, + 0x134a96, + 0x10cf7f, + 0x124d03, + 0x13f8a1, + 0x117c58, + 0x132c94, + 0x134fc0, + 0x10a091, + 0x128961, + 0x19, + 0x84afc741f1c13213, + 0x2f8f43734fc906f3, + 0xde682d72da0a02d9, + 0xbb005236adb9ef2, + 0x5bdf35c10a8b5624, + 0x739a8a343950010, + 0x52f515f44785cfbc, + 0xcbaf4e5d82856c60, + 0xac9ea09074e3e150, + 0x8f0fa011a2035fb0, + 0x1a37905d8450904a, + 0x1300, + 0x1750, + 0x114e, + 0x131f, + 0x167b, + 0x1371, + 0x1230, + 0x182c, + 0x1368, + 0xf31, + 0x15c9, + 0x19, + 0x3abeb80def61cc85, + 0x9d19c9dd4eac4133, + 0x75a652d9641a985, + 0x9daf69ae1b67e667, + 0x364f71da77920a18, + 0x50bd769f745c95b1, + 0xf223d1180dbbf3fc, + 0x2f885e584e04aa99, + 0xb69a0fa70aea684a, + 0x9584acaa6e062a0, + 0xbc051640145b19b, + 0x14, + 0x22, + 0x12, + 0x27, + 0xd, + 0xd, + 0x1c, + 0x2, + 0x10, + 0x29, + 0xf, } // C is a constant array of element C []*ffg.Element // M is a matrix M [][]*ffg.Element + // P is a matrix + P [][]*ffg.Element + // S is a array of element + S []*ffg.Element ) func init() { @@ -117,15 +829,24 @@ func init() { C = append(C, ffg.NewElementFromUint64(c[i])) } + for i := 0; i < len(s); i++ { + S = append(S, ffg.NewElementFromUint64(s[i])) + } + for i := 0; i < mLen; i++ { - var row []*ffg.Element + var ( + mRow []*ffg.Element + pRow []*ffg.Element + ) for j := 0; j < mLen; j++ { - ele := ffg.NewElementFromUint64(mcirc[(-i+j+mLen)%mLen]) + ele := ffg.NewElementFromUint64(mcirc[(i-j+mLen)%mLen]) if i == j { ele = ffg.NewElementFromUint64(mcirc[0] + mdiag[i]) } - row = append(row, ele) + mRow = append(mRow, ele) + pRow = append(pRow, ffg.NewElementFromUint64(p[i][j])) } - M = append(M, row) + M = append(M, mRow) + P = append(P, pRow) } } diff --git a/goldenposeidon/poseidon.go b/goldenposeidon/poseidon.go index c4be7ba..1f5a303 100644 --- a/goldenposeidon/poseidon.go +++ b/goldenposeidon/poseidon.go @@ -30,7 +30,7 @@ func ark(state []*ffg.Element, it int) { } // mix returns [[matrix]] * [vector] -func mix(state []*ffg.Element) []*ffg.Element { +func mix(state []*ffg.Element, opt bool) []*ffg.Element { mul := zero() newState := make([]*ffg.Element, mLen) for i := 0; i < mLen; i++ { @@ -39,14 +39,18 @@ func mix(state []*ffg.Element) []*ffg.Element { for i := 0; i < mLen; i++ { newState[i].SetUint64(0) for j := 0; j < mLen; j++ { - mul.Mul(M[i][j], state[j]) + if opt { + mul.Mul(P[j][i], state[j]) + } else { + mul.Mul(M[j][i], state[j]) + } newState[i].Add(newState[i], mul) } } return newState } -// Hash computes the Poseidon hash for the given inputs +// Hash computes the hash for the given inputs func Hash(inpBI [NROUNDSF]uint64, capBI [CAPLEN]uint64) ([CAPLEN]uint64, error) { state := make([]*ffg.Element, mLen) for i := 0; i < NROUNDSF; i++ { @@ -56,16 +60,40 @@ func Hash(inpBI [NROUNDSF]uint64, capBI [CAPLEN]uint64) ([CAPLEN]uint64, error) state[i+NROUNDSF] = ffg.NewElement().SetUint64(capBI[i]) } - for r := 0; r < NROUNDSF+NROUNDSP; r++ { - ark(state, r*mLen) + for i := 0; i < mLen; i++ { + state[i].Add(state[i], C[i]) + } - if r < NROUNDSF/2 || r >= NROUNDSF/2+NROUNDSP { - exp7state(state) - } else { - exp7(state[0]) + for r := 0; r < NROUNDSF/2; r++ { + exp7state(state) + ark(state, (r+1)*mLen) + state = mix(state, r == NROUNDSF/2-1) + } + + for r := 0; r < NROUNDSP; r++ { + exp7(state[0]) + state[0].Add(state[0], C[(NROUNDSF/2+1)*mLen+r]) + + s0 := zero() + mul := zero() + mul.Mul(S[(mLen*2-1)*r], state[0]) + s0.Add(s0, mul) + for i := 1; i < mLen; i++ { + mul.Mul(S[(mLen*2-1)*r+i], state[i]) + s0.Add(s0, mul) + mul.Mul(S[(mLen*2-1)*r+mLen+i-1], state[0]) + state[i].Add(state[i], mul) + } + state[0] = s0 + } + + for r := 0; r < NROUNDSF/2; r++ { + exp7state(state) + if r < NROUNDSF/2-1 { + ark(state, (NROUNDSF/2+1+r)*mLen+NROUNDSP) } - state = mix(state) + state = mix(state, false) } return [CAPLEN]uint64{ diff --git a/goldenposeidon/poseidon_test.go b/goldenposeidon/poseidon_test.go index cd108d6..ee86695 100644 --- a/goldenposeidon/poseidon_test.go +++ b/goldenposeidon/poseidon_test.go @@ -1,20 +1,23 @@ package poseidon import ( + "math/big" "testing" + "github.com/iden3/go-iden3-crypto/poseidon" "github.com/stretchr/testify/assert" ) const prime uint64 = 18446744069414584321 -func TestPoseidonHash(t *testing.T) { +func TestPoseidonHashCompare(t *testing.T) { b0 := uint64(0) b1 := uint64(1) bm1 := prime - 1 bM := prime - h, err := Hash([NROUNDSF]uint64{b0, b0, b0, b0, b0, b0, b0, b0}, [CAPLEN]uint64{b0, b0, b0, b0}) + h, err := Hash([NROUNDSF]uint64{b0, b0, b0, b0, b0, b0, b0, b0}, + [CAPLEN]uint64{b0, b0, b0, b0}) assert.Nil(t, err) assert.Equal(t, [CAPLEN]uint64{ @@ -25,7 +28,8 @@ func TestPoseidonHash(t *testing.T) { }, h, ) - h, err = Hash([NROUNDSF]uint64{b1, b1, b1, b1, b1, b1, b1, b1}, [CAPLEN]uint64{b1, b1, b1, b1}) + h, err = Hash([NROUNDSF]uint64{b1, b1, b1, b1, b1, b1, b1, b1}, + [CAPLEN]uint64{b1, b1, b1, b1}) assert.Nil(t, err) assert.Equal(t, [CAPLEN]uint64{ @@ -36,7 +40,8 @@ func TestPoseidonHash(t *testing.T) { }, h, ) - h, err = Hash([NROUNDSF]uint64{b1, b1, b1, b1, b1, b1, b1, b1}, [CAPLEN]uint64{b1, b1, b1, b1}) + h, err = Hash([NROUNDSF]uint64{b1, b1, b1, b1, b1, b1, b1, b1}, + [CAPLEN]uint64{b1, b1, b1, b1}) assert.Nil(t, err) assert.Equal(t, [CAPLEN]uint64{ @@ -61,7 +66,8 @@ func TestPoseidonHash(t *testing.T) { }, h, ) - h, err = Hash([NROUNDSF]uint64{bM, bM, bM, bM, bM, bM, bM, bM}, [CAPLEN]uint64{b0, b0, b0, b0}) + h, err = Hash([NROUNDSF]uint64{bM, bM, bM, bM, bM, bM, bM, bM}, + [CAPLEN]uint64{b0, b0, b0, b0}) assert.Nil(t, err) assert.Equal(t, [CAPLEN]uint64{ @@ -92,3 +98,33 @@ func TestPoseidonHash(t *testing.T) { }, h, ) } + +func BenchmarkPoseidonHash12Inputs(b *testing.B) { + bigArray12 := []*big.Int{ + big.NewInt(1), + big.NewInt(2), + big.NewInt(3), + big.NewInt(4), + big.NewInt(5), + big.NewInt(6), + big.NewInt(7), + big.NewInt(8), + big.NewInt(9), + big.NewInt(10), + big.NewInt(11), + big.NewInt(12), + } + + for i := 0; i < b.N; i++ { + poseidon.Hash(bigArray12) //nolint:errcheck,gosec + } +} + +func BenchmarkNeptuneHash(b *testing.B) { + inp := [NROUNDSF]uint64{1, 2, 3, 4, 5, 6, 7, 8} + cap := [CAPLEN]uint64{10, 11, 12, 13} + + for i := 0; i < b.N; i++ { + Hash(inp, cap) //nolint:errcheck,gosec + } +}