#![allow(warnings)]
#[cfg(test)]
mod matrix_tests {
use crate::{
matrix::*, params::*, polynomials::*, tests::indcpa::indcpa_tests::*,
tests::params::params_tests::sec_level_strategy, vectors::*,
};
use proptest::prelude::*;
use tinyvec::{array_vec, ArrayVec};
// impl Matrix<Unreduced> {
// pub(in crate::tests) fn test_derive_mat() -> Self {
// let polyvecs = array_vec!([PolyVec<Unreduced>; 4] =>
// PolyVec::from(array_vec!([Poly<Unreduced>; 4] =>
// Poly::from_arr(&[481, 1919, 1434, 2359, 327, 1066, 3001, 649, 1037, 2971, 661, 1148, 1602, 864, 301, 1835, 515, 3018, 123, 2889, 2391, 1312, 1518, 1617, 3039, 1283, 511, 2696, 1104, 2023, 1369, 1628, 1733, 1975, 1946, 1715, 575, 2464, 2203, 3272, 750, 1548, 2743, 1199, 154, 3326, 2504, 1908, 3230, 829, 2523, 982, 433, 2678, 2347, 1273, 1043, 3288, 1135, 3196, 1469, 436, 1977, 1577, 829, 324, 569, 2919, 1046, 2334, 3102, 461, 219, 707, 1709, 2610, 1409, 735, 1653, 2204, 3187, 2221, 3041, 2523, 3211, 1529, 2718, 758, 119, 2999, 1546, 367, 895, 1064, 1911, 218, 3090, 1393, 1318, 120, 1868, 1120, 323, 919, 1339, 452, 2905, 977, 2691, 539, 734, 3126, 2364, 138, 2035, 1543, 2103, 2457, 2797, 3006, 34, 2494, 300, 2538, 1591, 952, 88, 352, 2524, 1868, 1653, 1839, 1332, 3184, 3048, 2575, 83, 1704, 1938, 906, 2085, 2472, 295, 2091, 1431, 669, 3093, 202, 1287, 502, 2210, 1374, 1632, 1327, 3230, 2641, 2962, 3008, 810, 1771, 333, 1960, 2303, 1435, 166, 3156, 3255, 757, 1480, 3123, 2027, 3237, 1697, 2600, 2184, 569, 3241, 1626, 2166, 2938, 1894, 441, 3105, 244, 45, 1116, 999, 2881, 1309, 871, 2064, 736, 1028, 505, 592, 2335, 2810, 1046, 1815, 250, 3063, 1762, 416, 2610, 3075, 65, 2929, 1695, 2207, 165, 717, 881, 2659, 2898, 735, 205, 3289, 2744, 1685, 1388, 1146, 2889, 1701, 614, 1735, 2356, 1270, 2759, 2732, 1471, 592, 2283, 1775, 537, 1189, 2067, 1354, 188, 3175, 1224, 1869, 559, 1104, 1641, 914, 177, 3224, 931, 1796, 3263, 3011, 1370, 1926, 2513, 2367, 3216]),
// Poly::from_arr(&[797, 993, 161, 6, 2608, 2385, 2096, 2661, 1676, 247, 2440, 342, 634, 194, 1570, 2848, 986, 684, 3148, 3208, 2018, 351, 2288, 612, 1394, 170, 1521, 3119, 58, 596, 2093, 1549, 409, 2156, 1934, 1730, 1324, 388, 446, 418, 1719, 2202, 1812, 98, 1019, 2369, 214, 2699, 28, 1523, 2824, 273, 402, 2899, 246, 210, 1288, 863, 2708, 177, 3076, 349, 44, 949, 854, 1371, 957, 292, 2502, 1617, 1501, 254, 7, 1761, 2581, 2206, 2655, 1211, 629, 1274, 2358, 816, 2766, 2115, 2985, 1006, 2433, 856, 2596, 3192, 1, 1378, 2345, 707, 1891, 1669, 536, 1221, 710, 2511, 120, 1176, 322, 1897, 2309, 595, 2950, 1171, 801, 1848, 695, 2912, 1396, 1931, 1775, 2904, 893, 2507, 1810, 2873, 253, 1529, 1047, 2615, 1687, 831, 1414, 965, 3169, 1887, 753, 3246, 1937, 115, 2953, 586, 545, 1621, 1667, 3187, 1654, 1988, 1857, 512, 1239, 1219, 898, 3106, 391, 1331, 2228, 3169, 586, 2412, 845, 768, 156, 662, 478, 1693, 2632, 573, 2434, 1671, 173, 969, 364, 1663, 2701, 2169, 813, 1000, 1471, 720, 2431, 2530, 3161, 733, 1691, 527, 2634, 335, 26, 2377, 1707, 767, 3020, 950, 502, 426, 1138, 3208, 2607, 2389, 44, 1358, 1392, 2334, 875, 2097, 173, 1697, 2578, 942, 1817, 974, 1165, 2853, 1958, 2973, 3282, 271, 1236, 1677, 2230, 673, 1554, 96, 242, 1729, 2518, 1884, 2272, 71, 1382, 924, 1807, 1610, 456, 1148, 2479, 2152, 238, 2208, 2329, 713, 1175, 1196, 757, 1078, 3190, 3169, 708, 3117, 154, 1751, 3225, 1364, 154, 23, 2842, 1105, 1419, 79, 5, 2013]),
// Poly::from_arr(&[346, 2006, 2853, 1737, 2925, 1, 2669, 890, 326, 1124, 2001, 1055, 1102, 1450, 1432, 1869, 2497, 525, 746, 1624, 199, 1075, 1970, 3193, 2282, 3010, 1178, 2017, 25, 3011, 2965, 820, 2733, 2016, 471, 2882, 281, 784, 1160, 677, 1294, 2105, 1463, 108, 696, 2111, 1858, 1030, 1472, 2523, 1291, 2393, 1485, 3167, 196, 1871, 707, 1105, 3083, 84, 7, 959, 2003, 2260, 1445, 1594, 1360, 318, 234, 3113, 11, 3106, 3046, 300, 1074, 1957, 2762, 538, 3018, 1874, 753, 2452, 2375, 739, 2987, 2985, 817, 257, 2539, 3014, 662, 2760, 797, 2864, 1884, 836, 2418, 1661, 1251, 794, 373, 2068, 1988, 1247, 2341, 2006, 1079, 3076, 1521, 1248, 878, 1551, 1711, 2360, 113, 1663, 1642, 1028, 321, 2386, 1231, 2546, 2464, 1512, 1181, 1268, 1378, 1048, 827, 1051, 2961, 2090, 2935, 1136, 2639, 2468, 1331, 3023, 837, 236, 1267, 927, 2575, 352, 1269, 453, 3003, 2462, 2023, 2503, 2590, 2115, 2659, 2532, 1957, 3192, 1573, 417, 2529, 3000, 2174, 2381, 612, 1967, 24, 3039, 2263, 2893, 2506, 1782, 1223, 2195, 1069, 3267, 1021, 2897, 129, 2940, 2417, 1285, 2757, 1770, 204, 2142, 497, 359, 1933, 294, 776, 2059, 84, 2081, 1686, 2656, 3129, 727, 86, 3155, 3209, 1467, 1632, 1193, 3235, 1713, 1337, 1891, 280, 1467, 1912, 393, 1646, 2538, 2935, 146, 2366, 1690, 2493, 2340, 1052, 1409, 2121, 1892, 2768, 2078, 3260, 1182, 1556, 973, 1536, 3009, 2603, 2995, 454, 2465, 2274, 44, 1288, 1343, 2838, 718, 2865, 3303, 2023, 2118, 2328, 1183, 3143, 1048, 78, 55, 2916, 2773, 253, 415, 3070, 1107]),
// )).unwrap(),
// PolyVec::from(array_vec!([Poly<Unreduced>; 4] =>
// Poly::from_arr(&[2512, 1187, 75, 2259, 2131, 1317, 940, 936, 21, 1685, 666, 3191, 2923, 2756, 2780, 2476, 3045, 1684, 1334, 1216, 830, 2373, 1113, 1362, 1096, 2256, 2747, 1946, 2283, 2726, 1272, 748, 1660, 313, 1784, 2693, 99, 2940, 2469, 592, 253, 2950, 1535, 3053, 17, 3269, 3141, 2994, 2194, 181, 1496, 665, 863, 1981, 2319, 1725, 3173, 1197, 442, 1016, 2037, 964, 3247, 1085, 1750, 2351, 2339, 2193, 2362, 559, 1395, 617, 2232, 852, 371, 445, 1172, 665, 581, 1475, 2188, 1465, 2646, 1690, 2210, 1838, 1202, 2743, 2032, 2002, 2125, 327, 13, 1820, 83, 1157, 797, 118, 2467, 1875, 3169, 2287, 2150, 3311, 1424, 2201, 1951, 323, 69, 2638, 2631, 2414, 314, 1759, 325, 474, 749, 2597, 1252, 547, 1243, 3027, 342, 1701, 386, 2071, 493, 2778, 3291, 2408, 1653, 1938, 3144, 1255, 2725, 2995, 880, 2324, 199, 2831, 2604, 3174, 93, 1626, 1668, 1016, 2372, 1805, 2519, 1849, 1221, 2867, 2738, 2119, 3165, 108, 2500, 483, 576, 99, 367, 198, 2696, 1016, 2610, 958, 2893, 1695, 1729, 845, 1079, 1388, 3246, 2692, 1824, 1519, 1649, 213, 3016, 2487, 1034, 161, 1515, 2843, 3107, 1888, 902, 2713, 207, 2497, 2352, 1603, 2601, 1312, 1882, 1200, 2075, 1546, 1695, 1674, 2373, 1931, 1133, 495, 1268, 2108, 3306, 1279, 570, 534, 1961, 732, 463, 2952, 2303, 2399, 1896, 1278, 2775, 354, 2239, 2996, 736, 1106, 570, 547, 808, 2660, 1490, 1382, 2579, 3122, 13, 159, 751, 1483, 2387, 59, 492, 1252, 1790, 2780, 1174, 1644, 2885, 3285, 777, 637, 502, 319, 2320, 3233, 2850, 3236, 1269, 855]),
// Poly::from_arr(&[2527, 690, 1729, 2539, 1892, 465, 1928, 1329, 413, 3299, 2062, 3046, 2100, 127, 3313, 1591, 69, 804, 1617, 134, 230, 562, 807, 1789, 928, 2068, 3088, 121, 1891, 1137, 1737, 1284, 829, 1295, 1343, 1854, 505, 1663, 2491, 1053, 1453, 769, 399, 1949, 428, 291, 948, 1366, 3225, 1929, 1780, 865, 632, 559, 714, 1730, 2732, 1067, 378, 2519, 2943, 2668, 1789, 2238, 2486, 877, 706, 2182, 1721, 1905, 2170, 587, 556, 1295, 492, 2125, 2595, 1150, 2054, 735, 374, 1552, 2080, 2424, 1829, 2514, 3084, 1861, 2350, 2321, 1593, 2516, 688, 2692, 1911, 1909, 147, 2323, 2115, 908, 1938, 3255, 667, 3313, 3016, 2834, 619, 2102, 60, 2856, 1019, 2217, 1358, 1147, 920, 3026, 1575, 31, 1274, 94, 3267, 2167, 723, 395, 1849, 2403, 827, 2481, 1980, 1547, 1168, 2531, 197, 1420, 1884, 350, 986, 1422, 3012, 1921, 138, 2641, 2610, 1094, 2889, 1639, 2258, 2987, 1598, 1083, 75, 822, 2490, 308, 1872, 824, 1480, 2378, 3098, 728, 1153, 2132, 3107, 44, 3324, 560, 936, 2776, 3117, 1640, 148, 1807, 763, 654, 1381, 208, 1065, 508, 1245, 1321, 1818, 2513, 2417, 3024, 867, 2919, 97, 3265, 480, 1005, 2716, 2370, 2250, 954, 2928, 1562, 3101, 2827, 1635, 507, 836, 2474, 1862, 1707, 1942, 2030, 331, 2897, 2492, 69, 2857, 3305, 2086, 3069, 3318, 648, 2206, 2594, 553, 369, 723, 894, 2186, 611, 210, 2380, 555, 2322, 1554, 649, 976, 516, 2271, 2607, 615, 41, 1866, 1285, 3238, 2858, 3216, 2517, 584, 582, 1917, 1802, 1595, 2201, 1484, 2638, 2107, 535, 762, 131, 2050, 2073]),
// Poly::from_arr(&[2160, 550, 1910, 2647, 219, 271, 2843, 2289, 2881, 2078, 2163, 1899, 888, 2079, 1051, 37, 400, 1408, 1262, 2835, 1606, 1472, 401, 3071, 2650, 3146, 276, 844, 1944, 2901, 1230, 2462, 2353, 264, 931, 605, 1381, 491, 2136, 717, 1164, 2312, 1676, 2386, 1399, 1128, 2117, 3276, 8, 7, 972, 2865, 804, 2797, 288, 2102, 1498, 524, 1695, 284, 628, 2544, 1025, 2134, 1713, 2417, 3202, 343, 2673, 2743, 2039, 2830, 1008, 3102, 738, 1504, 2607, 1083, 1207, 597, 3171, 2488, 2238, 2290, 541, 1391, 754, 216, 3024, 338, 503, 1124, 3279, 590, 1564, 2308, 623, 344, 2940, 1435, 719, 2115, 1573, 683, 3235, 762, 94, 1121, 3005, 511, 1822, 484, 1979, 513, 2012, 2629, 86, 890, 511, 2228, 1030, 3316, 928, 667, 3312, 454, 397, 479, 2600, 791, 1429, 3291, 1363, 932, 1128, 851, 2763, 912, 1206, 1965, 653, 1465, 2621, 119, 3091, 2157, 765, 1230, 2297, 2161, 45, 528, 1501, 55, 1461, 2517, 2626, 1006, 957, 1628, 1712, 1420, 1952, 1736, 1786, 616, 1413, 2871, 968, 628, 2746, 2615, 2647, 1855, 256, 40, 3242, 2672, 1977, 2108, 2907, 2886, 3124, 1196, 1925, 2600, 2604, 761, 2211, 1973, 2278, 1952, 969, 1521, 388, 3054, 3189, 860, 404, 1612, 2524, 3319, 2224, 131, 3004, 2598, 1945, 2874, 1496, 3071, 964, 1158, 1341, 1171, 2219, 2213, 1161, 354, 221, 1743, 2235, 643, 1671, 1475, 2340, 1420, 1047, 2930, 1231, 2185, 2789, 2747, 2101, 3291, 2436, 2, 1978, 319, 3259, 2826, 3074, 1561, 396, 3173, 3144, 964, 1632, 2966, 2643, 2816, 1699, 1010, 1643, 3226, 2240, 288]),
// )).unwrap(),
// PolyVec::from(array_vec!([Poly<Unreduced>; 4] =>
// Poly::from_arr(&[1540, 2104, 1579, 2209, 449, 2031, 752, 2014, 463, 2703, 1037, 1922, 465, 3311, 888, 166, 414, 3165, 2905, 1164, 450, 3308, 1114, 1234, 2641, 2446, 2306, 2219, 1738, 2473, 1538, 1902, 82, 2566, 2980, 804, 2694, 761, 2972, 3006, 546, 1086, 2101, 1091, 99, 2062, 2368, 1057, 1091, 666, 2052, 2855, 3031, 1824, 2219, 1082, 1352, 3023, 2562, 1313, 1935, 1630, 858, 2948, 1080, 1674, 1954, 710, 2115, 526, 3053, 569, 2257, 2393, 3066, 2585, 806, 2436, 1729, 2636, 364, 2934, 1939, 1848, 2481, 2391, 439, 1488, 374, 2771, 1358, 486, 2794, 739, 648, 3319, 2055, 844, 2198, 1910, 1613, 657, 1709, 1172, 3040, 1671, 645, 553, 3281, 32, 2577, 1163, 1447, 1463, 2839, 2883, 2765, 1347, 1913, 391, 1698, 1435, 1045, 996, 2752, 3003, 159, 3016, 832, 1, 2868, 799, 1646, 1246, 449, 2526, 844, 94, 2506, 414, 2800, 2715, 3188, 1017, 2364, 283, 2439, 2597, 2405, 647, 120, 2872, 3079, 1638, 116, 1511, 2927, 3149, 732, 582, 3110, 2387, 1546, 199, 2332, 840, 1691, 1388, 2645, 1164, 3200, 680, 3090, 2958, 2334, 2909, 717, 486, 202, 832, 669, 2853, 1761, 13, 687, 2574, 610, 2717, 936, 306, 647, 3069, 1172, 3080, 1047, 2441, 1804, 2166, 570, 239, 2711, 1760, 2667, 1252, 802, 2495, 950, 982, 3161, 1883, 304, 3271, 2870, 917, 2006, 2088, 3199, 754, 3054, 1746, 1581, 967, 1226, 2686, 3186, 2028, 1722, 2370, 2074, 2174, 2225, 2211, 2665, 1944, 2675, 264, 1391, 696, 3039, 2166, 2497, 304, 1882, 705, 700, 376, 1008, 2649, 1823, 684, 657, 2668, 2810, 747, 2017, 2282]),
// Poly::from_arr(&[1642, 1316, 3309, 3204, 1436, 289, 1683, 2323, 2042, 193, 522, 1142, 963, 3263, 1619, 1548, 2851, 804, 918, 1299, 2316, 2153, 2425, 2546, 1711, 3212, 286, 3225, 370, 881, 1190, 1, 2657, 1035, 2827, 1029, 3246, 2840, 3304, 1756, 566, 2288, 2752, 2529, 1247, 1849, 754, 2279, 1131, 1337, 912, 2635, 2401, 2963, 2852, 421, 3062, 2816, 1295, 1843, 2358, 674, 728, 2450, 1208, 454, 519, 123, 1312, 2571, 305, 1356, 1312, 2899, 3158, 2256, 184, 319, 3045, 1369, 2905, 1932, 240, 1028, 337, 3279, 2024, 1728, 45, 1005, 592, 1404, 2307, 140, 2227, 3300, 1213, 1447, 190, 572, 2392, 674, 1689, 1456, 2426, 3186, 3140, 584, 718, 1255, 1717, 1933, 2631, 2344, 947, 1562, 1002, 1464, 2608, 36, 2499, 1793, 1824, 2622, 1187, 1179, 2025, 3122, 363, 1623, 2417, 1019, 1855, 71, 1455, 3124, 2407, 687, 362, 1638, 652, 1198, 3042, 495, 3145, 1620, 2356, 1548, 2908, 702, 2712, 1638, 81, 1992, 57, 3214, 2805, 790, 594, 2812, 3254, 566, 1639, 2580, 1685, 1998, 3199, 600, 295, 917, 417, 772, 1789, 3228, 519, 1917, 2476, 2230, 68, 160, 1637, 264, 991, 591, 2923, 2734, 118, 2445, 97, 2701, 1435, 1564, 175, 1933, 2403, 234, 592, 205, 15, 2277, 2453, 2666, 2683, 2974, 865, 1189, 1223, 849, 204, 797, 2527, 3118, 1594, 2507, 2836, 2753, 2014, 2926, 3039, 2989, 1204, 2013, 313, 2302, 725, 1441, 502, 3135, 1911, 359, 2503, 2114, 2449, 696, 2806, 1964, 3080, 2327, 74, 125, 43, 2882, 608, 1490, 2450, 1421, 1589, 1967, 2915, 1324, 2335, 2483, 1181, 1973, 2847, 1454]),
// Poly::from_arr(&[2300, 310, 1599, 2051, 1859, 745, 1044, 1449, 2862, 1505, 1036, 1878, 1727, 2411, 3252, 802, 2219, 1390, 615, 2727, 1530, 542, 3136, 3046, 1891, 747, 2023, 1531, 2296, 555, 305, 2336, 1869, 863, 566, 1490, 1525, 1316, 1982, 2499, 420, 215, 747, 301, 2597, 2911, 1008, 1388, 138, 2181, 2861, 401, 242, 1115, 1788, 1565, 1837, 412, 1427, 1811, 304, 2850, 2114, 1010, 2578, 2304, 1410, 1091, 410, 12, 540, 1943, 2767, 2991, 2275, 750, 112, 1235, 415, 3063, 3224, 1143, 788, 1451, 2546, 1978, 3054, 730, 151, 1016, 2079, 3131, 487, 127, 1575, 252, 1280, 1421, 635, 1366, 59, 1794, 2731, 515, 921, 10, 2040, 148, 1758, 2714, 2850, 1377, 629, 963, 50, 2415, 759, 1161, 3097, 2137, 2684, 2622, 1266, 2148, 3326, 989, 1006, 2146, 2195, 3085, 2216, 1297, 3017, 2931, 179, 2826, 3262, 96, 914, 2745, 1114, 1342, 1231, 1864, 973, 2240, 234, 1696, 189, 2770, 439, 774, 2664, 461, 531, 419, 691, 1545, 2137, 621, 2564, 401, 3021, 2103, 549, 2141, 713, 1606, 1562, 1405, 1014, 2394, 2927, 1338, 425, 451, 2593, 3252, 1330, 2143, 3251, 428, 3043, 1806, 3176, 2667, 213, 2948, 592, 114, 3319, 1936, 1254, 971, 2866, 845, 918, 2203, 2503, 388, 751, 304, 843, 2578, 2176, 961, 2374, 1222, 2959, 1630, 95, 3076, 2442, 2875, 1357, 1301, 2224, 202, 2011, 2688, 2439, 1936, 1514, 194, 362, 2117, 2476, 742, 596, 2084, 1130, 1539, 2803, 1643, 282, 664, 1740, 1193, 2107, 1464, 2256, 2741, 1112, 1723, 2182, 256, 527, 2918, 1814, 1290, 482, 567, 2509, 34, 15, 2490]),
// )).unwrap(),
// );
// Self {
// polyvecs,
// sec_level: K::Three,
// }
// }
// }
prop_compose! {
pub(in crate::tests) fn new_matrix()
(sec_level in sec_level_strategy(), seed in prop::array::uniform32(u8::MIN..u8::MAX), transpose in prop::bool::ANY)
-> Matrix<Montgomery> {
Matrix::derive(&seed, transpose, sec_level.k()).unwrap()
}
}
// had to use modified fns to properly test, but passed
// #[test]
// fn derive_seed_test() {
// let seed: [u8; 32] = core::array::from_fn(|i| i as u8);
// let matrix = Matrix::derive_for_test(&seed, false, K::Three).unwrap();
// assert_eq!(matrix, Matrix::test_derive_mat());
// }
proptest! {
#[test]
fn derive_test(
sec_level in sec_level_strategy(),
seed in prop::array::uniform32(u8::MIN..u8::MAX),
transpose in prop::bool::ANY,
) {
let matrix = Matrix::derive(&seed, transpose, sec_level.k()).unwrap();
}
#[test]
fn vectors_test(mat in new_matrix()) {
let vecs = mat.vectors();
}
#[test]
fn transpose_test(
sec_level in sec_level_strategy(),
seed in prop::array::uniform32(u8::MIN..u8::MAX),
) {
let matrix_1 = Matrix::derive(&seed, false, sec_level.k()).unwrap().transpose().unwrap();
let matrix_2 = Matrix::derive(&seed, true, sec_level.k()).unwrap();
assert_eq!(matrix_1, matrix_2);
}
}
}