pxfm/bessel/
j0f_coeffs.rs

1/*
2 * // Copyright (c) Radzivon Bartoshyk 7/2025. All rights reserved.
3 * //
4 * // Redistribution and use in source and binary forms, with or without modification,
5 * // are permitted provided that the following conditions are met:
6 * //
7 * // 1.  Redistributions of source code must retain the above copyright notice, this
8 * // list of conditions and the following disclaimer.
9 * //
10 * // 2.  Redistributions in binary form must reproduce the above copyright notice,
11 * // this list of conditions and the following disclaimer in the documentation
12 * // and/or other materials provided with the distribution.
13 * //
14 * // 3.  Neither the name of the copyright holder nor the names of its
15 * // contributors may be used to endorse or promote products derived from
16 * // this software without specific prior written permission.
17 * //
18 * // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 * // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 * // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 * // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/**
31J0 zeros and extremums.
32
33Generated by SageMath:
34```python
35# searching for zeros and extremums
36R120 = RealField(120)
37
38zeros = []
39
40mp.prec = 150
41
42step = mpf("0.001")
43epsilon = mpf("1e-35")
44x = mpf("0.0")
45
46def j0_prime(x):
47    return diff(lambda t: besselj(0, t), x)
48
49previous_zero = R120(0)
50j0_zeros = []
51
52while x < mpf("76.0"):
53    f1 = besselj(0, x)
54    f2 = besselj(0, x + step)
55    if f1 * f2 < 0:
56        zero = findroot(lambda t: j0(t), (x, x + step), solver='bisect', tol=mp.mpf("1e-41"))
57        previous_zero = zero
58        j0_zeros.append(zero)
59    if previous_zero is not None and abs(x - mpf(f'{round(x)}')) < epsilon:
60        zeros.append(previous_zero)
61    x += step
62
63j0_extrema = []
64
65x = mpf("0.0")
66while x < mpf("76.0"):
67    d1 = mp.diff(lambda t: j0(t), x)
68    d2 = mp.diff(lambda t: j0(t), x + step)
69    if d1 * d2 < 0:
70        extremum = findroot(lambda t: mp.diff(lambda u: j0(u), t), (x, x + step), solver='bisect', tol=mp.mpf("1e-41"))
71        j0_extrema.append(extremum)
72    x += step
73
74# Print results
75for i, z in enumerate(j0_zeros):
76    print(f"Zero {i+1}: x ≈ {z}")
77
78print("Extrema (peaks/valleys) of J0(x):")
79for e in j0_extrema:
80    print(f"nExtrema: {e}")
81
82j0_zeros.extend(j0_extrema)
83
84j0_zeros = sorted(j0_zeros)
85
86# Print results
87for i, z in enumerate(j0_zeros):
88    print(f"Peak or zero {i+1}: x ≈ {z}")
89
90print("")
91
92print("pub(crate) static J0_ZEROS: [(u64, u64); 48] = [")
93print(f"(0x0, 0x0),")
94for z in j0_zeros:
95    k = split_double_double(z)
96    hi = double_to_hex(k[1])
97    lo = double_to_hex(k[0])
98    print(f"({lo}, {hi}),")
99
100print("];")
101```
102**/
103pub(crate) static J0_ZEROS: [(u64, u64); 48] = [
104    (0x0, 0x0),
105    (0xbca0f539d7da258e, 0x40033d152e971b40),
106    (0xbca60155a9d1b256, 0x400ea75575af6f09),
107    (0x3c975054cd60a517, 0x4016148f5b2c2e45),
108    (0xbc9b226d9d243827, 0x401c0ff5f3b47250),
109    (0xbcb51970714c7c25, 0x40214eb56cccdeca),
110    (0x3cc02610a51562b6, 0x402458d0d0bdfc29),
111    (0x3cb444fd5821d5b1, 0x40279544008272b6),
112    (0x3cb2bce7fd18e693, 0x402aa5baf310e5a2),
113    (0xbcc9796609364e85, 0x402ddca13ef271d2),
114    (0xbcdd2a68e88ab317, 0x4030787b360508c5),
115    (0xbcd165fd108f46ff, 0x403212313f8a19f6),
116    (0xbcd21830197e9e86, 0x40339da8e7416ca4),
117    (0x3cc1d2dfa1c3b5a8, 0x4035362dd173f792),
118    (0xbcc1bf33afef88f1, 0x4036c294e3d4d8ac),
119    (0x3cd0847c620015e0, 0x40385a3b930156dd),
120    (0x3cc1a2686480d882, 0x4039e7570dcea106),
121    (0x3cdd2b3714972b28, 0x403b7e54a5fd5f11),
122    (0xbcb42ce39ec976fb, 0x403d0bfcf471fccc),
123    (0xbcc36bbabc1c9f31, 0x403ea27591cbbed2),
124    (0xbcdbe3a1cd066b66, 0x404018476e6b2bf0),
125    (0x3cda326cf4307839, 0x4040e34e13a66fe6),
126    (0xbced5fbbff045068, 0x4041aa890dc5e97c),
127    (0xbcd0b6068f861c6f, 0x404275637a9619ec),
128    (0x3cc9eafeca0ca4fd, 0x40433cc523d5cb69),
129    (0xbcb34c86f4e27936, 0x4044077a7ed6293a),
130    (0x3cc489bd556e510a, 0x4044cefcf1734b62),
131    (0x3cced48fe99f45ef, 0x40459992c65d0d8d),
132    (0x3ce4f716f3179d90, 0x404661315d6b133f),
133    (0xbcd05a7a0525058f, 0x40472bac0f810810),
134    (0xbcef3950a842db79, 0x4047f36312028ad6),
135    (0x3ce575dc7f8a031a, 0x4048bdc6293f0657),
136    (0x3ce85d7bdb30baf1, 0x404985928f96d51e),
137    (0xbcdfa16a338bbaee, 0x404a4fe0ee444c7b),
138    (0x3ce3d41e041caa68, 0x404b17c038c2018c),
139    (0xbce43e4a90356acf, 0x404be1fc41a4c607),
140    (0x3cda139ce2cd08ac, 0x404ca9ec5a82324b),
141    (0x3ce0f4b1c9544480, 0x404d74180c9e41f6),
142    (0xbcb12e6ef2e594e1, 0x404e3c1731d64f1e),
143    (0x3ceff10a69607aab, 0x404f06343d0971d4),
144    (0x3cdfd1ee8286358a, 0x404fce40efb1156e),
145    (0xbcf8991ca07c84c0, 0x40504c28621f11e6),
146    (0x3ced3cacfc720419, 0x4050b034dde75b42),
147    (0xbcee90a52cffc26f, 0x40511536cb22d72b),
148    (0xbcee669304bfe748, 0x40517948db63675c),
149    (0xbcf5328276c045f2, 0x4051de4554a1c2dd),
150    (0x3cf8eb4a94b63936, 0x4052425c7dcacdf6),
151    (0x3cff05f585843675, 0x4052a753fa820480),
152];
153
154/**
155Roots and values for extremums and J0 zeros.
156
157Generated by MPFR:
158```text
159let mut arr = vec![];
160for zeros in J0_ZEROS.iter() {
161    let mpfr = Float::with_val(107, f64::from_bits(zeros.1)).j0();
162    arr.push(mpfr.to_f64().to_bits());
163}
164println!(
165    "arr: [{}]",
166    arr.iter()
167        .map(|x| format!("0x{:016x}", x))
168        .collect::<Vec<_>>()
169        .join(", ")
170);
171```
172**/
173pub(crate) static J0_ZEROS_VALUE: [u64; 48] = [
174    0x3ff0000000000000,
175    0xbc919b7921f03c8e,
176    0xbfd9c6cf582cbf7f,
177    0xbc7fbb40985f6e34,
178    0x3fd33518b3874e8a,
179    0xbc96e8eeb22e5818,
180    0xbfcff654544ebcd1,
181    0xbc92d8ed368e0843,
182    0x3fcbf3337873a7d8,
183    0xbca50be2ef09843e,
184    0xbfc925c6fca08f55,
185    0x3caa2122af76659e,
186    0x3fc70c511227d5aa,
187    0x3c98b4b912da2218,
188    0xbfc5664e13b70622,
189    0xbca55e059345b430,
190    0x3fc40f90793605bb,
191    0x3cb1c17abe35eaae,
192    0xbfc2f2072e638cf4,
193    0x3c966608ac164dbd,
194    0x3fc1ff5eec6a01cd,
195    0x3cacc62c8409daa7,
196    0xbfc12dd57bf18ada,
197    0x3ca18e7b1f5c77ae,
198    0x3fc076826cc2c191,
199    0xbc8376cc57901722,
200    0xbfbfa8b41711c83a,
201    0xbc9df12b66b26573,
202    0x3fbe8727daa3daed,
203    0xbc9eab3b2bf5813d,
204    0xbfbd8293aa55d18f,
205    0xbcb3795064667200,
206    0x3fbc96700bf039e2,
207    0xbcabd526bce38ac7,
208    0xbfbbbf246914235f,
209    0x3cb14dbc2a692434,
210    0x3fbaf9cb49c4f935,
211    0x3cac341b9f831174,
212    0xbfba4407e04298d1,
213    0xbcb9e23f9c9ca91e,
214    0x3fb99be744018c90,
215    0xbcc3725f95922088,
216    0xbfb8ffc9bd24fe08,
217    0x3cb79a2187735244,
218    0x3fb86e51be0a9153,
219    0xbcc0012df1d3ef73,
220    0xbfb7e656efb009ae,
221    0xbcc6ecd27843db59,
222];
223
224/**
225Taylor coefficients for J0 [0; 74.62]
226
227Generated by SageMath with Sollya:
228```python
229def compute_intervals(zeros):
230    intervals = []
231    for i in range(0, len(zeros)):
232        if i == 0:
233            a = (zeros[i]) / 2 - 0.05 - zeros[i]
234            b = (zeros[i] + zeros[i + 1]) / 2 + 0.05 - zeros[i]
235            intervals.append((RealField(18)(a), RealField(18)(b), RealField(110)(zeros[i])))
236        elif i + 1 > len(zeros) - 1:
237            a = (zeros[i - 1] + zeros[i]) / 2 - 0.05 - zeros[i]
238            b = (zeros[i]) + 0.83 + 0.05 - zeros[i]
239            intervals.append((RealField(18)(a), RealField(18)(b), RealField(110)(zeros[i])))
240        else:
241            a = (zeros[i - 1] + zeros[i]) / 2 - zeros[i] - 0.05
242            b = (zeros[i] + zeros[i + 1]) / 2 + 0.05  - zeros[i]
243            intervals.append((RealField(18)(a), RealField(18)(b), RealField(110)(zeros[i])))
244    return intervals
245
246intervals = compute_intervals(j0_zeros)
247# print(intervals)
248
249def build_sollya_script(a, b, zero, deg):
250    return f"""
251prec = 500;
252bessel_j0 = library("./notes/bessel_sollya/cmake-build-release/libbessel_sollya.dylib");
253f = bessel_j0(x + {zero});
254d = [{a}, {b}];
255pf = remez(f, {deg}, d);
256for i from 0 to degree(pf) do {{
257    write(coeff(pf, i)) >> "coefficients.txt";
258    write("\\n") >> "coefficients.txt";
259}};
260"""
261
262def load_coefficients(filename):
263    with open(filename, "r") as f:
264        return [RR(line.strip()) for line in f if line.strip()]
265
266def call_sollya_on_interval(a, b, zero, degree=12):
267    sollya_script = build_sollya_script(a, b, zero, degree)
268    with open("tmp_interval.sollya", "w") as f:
269        f.write(sollya_script)
270    import subprocess
271    if os.path.exists("coefficients.txt"):
272        os.remove("coefficients.txt")
273    try:
274        result = subprocess.run(
275            ["sollya", "tmp_interval.sollya"],
276            check=True,
277            capture_output=True,
278            text=True
279        )
280    except subprocess.CalledProcessError as e:
281        return
282
283degree = 13
284
285print(f"pub(crate) static J0F_COEFFS: [[u64;{degree + 1}]; {len(intervals)}] = [")
286for i in range(0, len(intervals)):
287    interval = intervals[i]
288    call_sollya_on_interval(interval[0], interval[1], interval[2], degree)
289    coeffs = load_coefficients(f"coefficients.txt")
290    print("[")
291    for c in coeffs:
292        print(double_to_hex(c) + ",")
293    print("],")
294print("];")
295```
296**/
297pub(crate) static J0F_COEFFS: [[u64; 14]; 47] = [
298    [
299        0xbca69de51bcc0120,
300        0xbfe09cdb3655127d,
301        0x3fbba1deea029925,
302        0x3facfae8643687e7,
303        0xbf81bb1cbe1caeb6,
304        0xbf61f992590d3f89,
305        0x3f315382bbf1a06b,
306        0x3f06ed3ba591e6da,
307        0xbed232c8d8aba5cc,
308        0xbea1cceb52db45ee,
309        0x3e68006b6b5682ca,
310        0x3e329cc1da0793f0,
311        0xbdf5dbb0053da32b,
312        0xbdc04e14e5d96539,
313    ],
314    [
315        0xbfd9c6cf582cbf7f,
316        0x3cb1d608597b5d8f,
317        0x3fc9c6cf582cbf55,
318        0xbf91f06d14e12b29,
319        0xbf8b589d1da0f7e4,
320        0x3f50f9103d00ae93,
321        0x3f38644561ce9290,
322        0xbefa2a034c749192,
323        0xbed83a0686fd1dd2,
324        0x3e96a5085d7844b5,
325        0x3e6ebfcaacd49b87,
326        0xbe2964b9932b57f3,
327        0xbdfad73cf4701511,
328        0x3db5acbea609d3e5,
329    ],
330    [
331        0xbc6a1105f9dbcdd5,
332        0x3fd5c6e60a097826,
333        0xbf9f8f72e7a8471e,
334        0xbfab2150cb41ece4,
335        0x3f72f7ffe901b59c,
336        0x3f627e31fe9ddafb,
337        0xbf26f641f369bbbd,
338        0xbf0863f485fc7e89,
339        0x3ecad77cbbb32bcd,
340        0x3ea32e705af41964,
341        0xbe62d9d2bb447e35,
342        0xbe341f0e4f4dc44a,
343        0x3df198b51eee9749,
344        0x3dbec8f104a030ca,
345    ],
346    [
347        0x3fd33518b3874e8a,
348        0xbca7f56ee546a569,
349        0xbfc33518b3874e3b,
350        0x3f7d34125d59fb96,
351        0x3f880c83bdee71b4,
352        0xbf4483c20f2abbd1,
353        0xbf36ffa5fc0ccc0f,
354        0x3ef2ccf7bbc1d620,
355        0x3ed796a6caa245fc,
356        0xbe91e85738cfdd42,
357        0xbe6e69b581df4be3,
358        0x3e2550287122730e,
359        0x3dfab73cc2e87ac7,
360        0xbdb250809ed630ba,
361    ],
362    [
363        0x3c684670459725e1,
364        0xbfd15f7977a772d5,
365        0x3f900f7fcf183c65,
366        0x3fa68b984ec64b1d,
367        0xbf648e63600c54a1,
368        0xbf60e0d6038721a4,
369        0x3f1d7960512fb682,
370        0x3f07800bc7410c66,
371        0xbec3324799a7e0fb,
372        0xbea30e8df2325ca1,
373        0x3e5cecefe3d75abb,
374        0x3e3458cbaa06ef8d,
375        0xbdec4dd6cf551d07,
376        0xbdbefa0975b65713,
377    ],
378    [
379        0xbfcff654544ebcd1,
380        0x3ca0ffc636e7373a,
381        0x3fbff654544ebc20,
382        0xbf70c17ff72b1352,
383        0xbf84b0c5d5d9e7c9,
384        0x3f394154be849b76,
385        0x3f34e12c2fdccc3a,
386        0xbee9f32fcfbab067,
387        0xbed63c53e4cc158b,
388        0x3e8adbb88b7826d7,
389        0x3e6d5f825ac22ee0,
390        0xbe20f17a50351084,
391        0xbdfa326458f60fce,
392        0x3dae0e0c6fa040ee,
393    ],
394    [
395        0xbc648b5c145d146f,
396        0x3fcdc13e66ac2e78,
397        0xbf842ff0cdc58194,
398        0xbfa38d1dd8992ef5,
399        0x3f5a55e9b344ea02,
400        0x3f5e2e16f97e7f5f,
401        0xbf13dfc37714f92e,
402        0xbf05ce7f4a51d917,
403        0x3ebbb177bc7895b4,
404        0x3ea2346df84ab988,
405        0xbe56125b44798bd5,
406        0xbe33d7cc75fbdd4e,
407        0x3de68bc84d67bb0a,
408        0x3dbe749161c75b7f,
409    ],
410    [
411        0x3fcbf3337873a7d8,
412        0xbc999eb31028b75f,
413        0xbfbbf3337873a725,
414        0x3f66604d91f94ba7,
415        0x3f8251858010ffd8,
416        0xbf314bc11a41832e,
417        0xbf32e7decc933381,
418        0x3ee293b4d39e1d9e,
419        0x3ed4a66fbc1f8e7c,
420        0xbe843cb02661be36,
421        0xbe6bdd61e41af9d3,
422        0x3e1ab24db7abbdd7,
423        0x3df940cc3ecafe33,
424        0xbda870435d8d1863,
425    ],
426    [
427        0x3c6110461d393f0c,
428        0xbfca701d0f967501,
429        0x3f7c54b930fef3e4,
430        0x3fa17798aa09f194,
431        0xbf52a21514062f70,
432        0xbf5b541f829ca99f,
433        0x3f0cc0bd9fd11443,
434        0x3f041f3b06c79efa,
435        0xbeb4b22fc3292c98,
436        0xbea1223e5773d27c,
437        0x3e5118e5cf14a591,
438        0x3e32ffb6478c2281,
439        0xbde20a2b34bd7e9f,
440        0xbdbd77afc051bc6c,
441    ],
442    [
443        0xbfc925c6fca08f54,
444        0x3c941bba0a9908a3,
445        0x3fb925c6fca08ea3,
446        0xbf6049377403d97d,
447        0xbf809463bbcfb70d,
448        0x3f297b35471ddd4a,
449        0x3f314dd43fc4bda8,
450        0xbedbf665e54737fe,
451        0xbed32caf8123dd12,
452        0x3e7f510484fa37ba,
453        0x3e6a42a3b8b1effd,
454        0xbe1544b8d56d77a8,
455        0xbdf81cfb72892ddb,
456        0x3da3f5749b01c5c3,
457    ],
458    [
459        0xbc5c64a3611bf4cb,
460        0x3fc8077f56c9b782,
461        0xbf75467eb535dac4,
462        0xbf9fd7c3ad6f5a3e,
463        0x3f4c1b47c806f9c6,
464        0x3f59166c7d3ee8f7,
465        0xbf05f01522f72552,
466        0xbf02aa939ff2e34a,
467        0x3eb0129642c0eedc,
468        0x3ea01716d7274ce0,
469        0xbe4b21ada69ec1ec,
470        0xbe320ffbd6f367e8,
471        0x3ddd441699eaa4df,
472        0x3dbc46351a30e033,
473    ],
474    [
475        0x3fc70c511227d5aa,
476        0xbc903dd711e6b7a7,
477        0xbfb70c511227d4fe,
478        0x3f5910ebe1f1fa45,
479        0x3f7e7dc08e6ff244,
480        0xbf23bd7d15b0a88f,
481        0xbf300357a101d595,
482        0x3ed5ec733cb20d5b,
483        0x3ed1e5d1fa4386ae,
484        0xbe78f423a07fedeb,
485        0xbe68c089aeb3a360,
486        0x3e1143a2a87b28be,
487        0x3df6f2d06548607b,
488        0xbda07d7d6f49ddb9,
489    ],
490    [
491        0x3c57d1baaf487c60,
492        0xbfc62d93aa9d05bb,
493        0x3f70ba9ce88926ac,
494        0x3f9d7073daebb038,
495        0xbf462813c7f32d76,
496        0xbf574a948d055ffc,
497        0x3f01695764ad01fd,
498        0x3f0170ab5ed77aa3,
499        0xbea9c8e2cba34328,
500        0xbe9e4d88f9ebcadb,
501        0x3e460ec3e9bbfca2,
502        0x3e312751ad8cf2c9,
503        0xbdd825b2017389c1,
504        0xbdbb0b4f2fdaca95,
505    ],
506    [
507        0xbfc5664e13b70621,
508        0x3c8adfee580612ab,
509        0x3fb5664e13b7057b,
510        0xbf540ee3940b2f9d,
511        0xbf7c5e1ad9fa40ad,
512        0x3f1fb8a98f136a0c,
513        0x3f2de9be57a255f8,
514        0xbed1bec95e73b04b,
515        0xbed0cf25bf302fd8,
516        0x3e746784408bf531,
517        0x3e676640f349bd8a,
518        0xbe0c944164ad511b,
519        0xbdf5d837e7a07aba,
520        0x3d9ba3ab0edd6dab,
521    ],
522    [
523        0xbc543722dc20f623,
524        0x3fc4b2a2ebf61ecd,
525        0xbf6b3297fdae7373,
526        0xbf9b8105d59b1125,
527        0x3f420a3f8c10a2c5,
528        0x3f55d18d69de4109,
529        0xbefc79db490d157b,
530        0xbf00679c92947f5d,
531        0x3ea53ac3d1de0eb7,
532        0x3e9ca750128116cf,
533        0xbe4252ac12ff61fa,
534        0xbe3051067c8a6420,
535        0x3dd4435be57e146d,
536        0x3db9dcd0ca8a2a1d,
537    ],
538    [
539        0x3fc40f90793605bb,
540        0xbc86a24c27e99837,
541        0xbfb40f907936051b,
542        0x3f5085775a554a25,
543        0x3f7aa0ce0420ebfd,
544        0xbf1a32a28e65afde,
545        0xbf2c26ebc916e22b,
546        0x3ecd740098d21c07,
547        0x3ecfc1baf78438dd,
548        0xbe710c76235f5aa1,
549        0xbe663455427d9c57,
550        0x3e08141f4d843200,
551        0x3df4d5216dec0df1,
552        0xbd977e29b16d5fdb,
553    ],
554    [
555        0x3c5158813dc387f0,
556        0xbfc37aac8c1aeabb,
557        0x3f66ac0d2e2f2ac1,
558        0x3f99e74e754ea6d8,
559        0xbf3e1c0589dfbd21,
560        0xbf5496158dc5b2be,
561        0x3ef7d554035ae72e,
562        0x3eff0b30f3d1fb7e,
563        0xbea1d9e26f5a608f,
564        0xbe9b35eeaebb5fed,
565        0x3e3f010034c79a0b,
566        0x3e2f1f31b65b3b40,
567        0xbdd1445486f07cd4,
568        0xbdb8c39615e71112,
569    ],
570    [
571        0xbfc2f2072e638cf3,
572        0x3c8361a1f631cd41,
573        0x3fb2f2072e638c5a,
574        0xbf4bd42b64fc9353,
575        0xbf792bb5e1e07ce1,
576        0x3f161ace339d0b73,
577        0x3f2aa8d1ce9fa384,
578        0xbec8ef625b21b762,
579        0xbece26d28032c92c,
580        0x3e6d0116b3ae24e4,
581        0x3e6526a75ee1fb24,
582        0xbe049a7cd1a8b231,
583        0xbdf3eac7c4ed94be,
584        0x3d943b63ca10efa6,
585    ],
586    [
587        0xbc4e15276b2257f6,
588        0x3fc27407dfadee6d,
589        0xbf6346950bfd8dcc,
590        0xbf988d48d1d4eb20,
591        0x3f399e6923aaadf2,
592        0x3f538984b76c8a40,
593        0xbef4521949da5854,
594        0xbefd855d7afc24f7,
595        0x3e9e8a86b94090aa,
596        0x3e99f1bce3767a28,
597        0xbe3aa3a4df470ca3,
598        0xbe2dc43a0da754d3,
599        0x3dcdd3f81803822b,
600        0x3db7c1fb1e948790,
601    ],
602    [
603        0x3fc1ff5eec6a01cd,
604        0xbc80d20b3aa154f7,
605        0xbfb1ff5eec6a0139,
606        0x3f47daf64983dfb0,
607        0x3f77ed5fffc0f26a,
608        0xbf12f9479636506c,
609        0xbf296027e938174a,
610        0x3ec57486d36f86d5,
611        0x3eccc1196ea00471,
612        0xbe690ae6942f1564,
613        0xbe64382bea1931c6,
614        0x3e01ddd9b1b7300f,
615        0x3df317ad2d0ae68b,
616        0xbd91a1072249bec4,
617    ],
618    [
619        0x3c4a5ad4fde0c9d8,
620        0xbfc192f23ce3e050,
621        0x3f60a668185bfe0f,
622        0x3f9764141d652022,
623        0xbf3624437a2d49f0,
624        0xbf52a184be0d3982,
625        0x3ef196de0d85b64c,
626        0x3efc317f84a19048,
627        0xbe9a80187c3c9493,
628        0xbe98d3840a83aa5f,
629        0x3e3730c02a4a94ac,
630        0x3e2c8d1491c62663,
631        0xbdca1189016a9692,
632        0xbdb6d754fe28a395,
633    ],
634    [
635        0xbfc12dd57bf18ad9,
636        0x3c7d8e82da6b051b,
637        0x3fb12dd57bf18a4a,
638        0xbf44bebeff7ba93d,
639        0xbf76d9afe882346d,
640        0x3f10842d50795e09,
641        0x3f2841d86abe55fe,
642        0xbec2b5cab87b5693,
643        0xbecb86b9f14c3df8,
644        0x3e65e518bb040851,
645        0x3e63642ad66ee13c,
646        0xbdff581d7497507c,
647        0xbdf2596d87b9a5f8,
648        0x3d8f0ac4f8bd7787,
649    ],
650    [
651        0xbc47483488f843f0,
652        0x3fc0cf3ed059c573,
653        0xbf5d242aa5298caf,
654        0xbf96613d93b0179b,
655        0x3f33627f261d008d,
656        0x3f51d69ca0d81e39,
657        0xbeeed574ad2bb0d3,
658        0xbefb06384da1c6bc,
659        0x3e97452b1c4c76e9,
660        0x3e97d51e823013c9,
661        0xbe346a18e9324483,
662        0xbe2b754cf5bbe0eb,
663        0x3dc70467e00ca1a0,
664        0x3db601d42e3f412d,
665    ],
666    [
667        0x3fc076826cc2c191,
668        0xbc7a319136b9885b,
669        0xbfb076826cc2c107,
670        0x3f4241b03eab1b46,
671        0x3f75e7f530011e0e,
672        0xbf0d17978e4af2b0,
673        0xbf2745b0deaaa29c,
674        0x3ec0803f899002ed,
675        0x3eca70060b7e6d91,
676        0xbe635913c3c95352,
677        0xbe62a694daaaf841,
678        0x3dfbc4a0d8050004,
679        0x3df1ad85820a38f2,
680        0xbd8b942dd09eb308,
681    ],
682    [
683        0x3c44bc1f080e9694,
684        0xbfc0230b9797a7b2,
685        0x3f59c8083b2b6f7f,
686        0x3f957d3203befd1b,
687        0xbf3127cba226824c,
688        0xbf5123447144f140,
689        0x3eeb4fe26c88e56e,
690        0x3ef9fc5254458847,
691        0xbe94a44b3f692077,
692        0xbe96f17d3ebae645,
693        0x3e3224c9056773e9,
694        0x3e2a78ba4580cd4b,
695        0xbdc481589f7c80a5,
696        0xbdb53f51ba6e502a,
697    ],
698    [
699        0xbfbfa8b41711c839,
700        0x3c776c1e8f7fbdf3,
701        0x3fafa8b41711c72d,
702        0xbf403a8d0f113157,
703        0xbf7511c6dad9e9ce,
704        0x3f09e040fc7d8bd2,
705        0x3f266582f59eaade,
706        0xbebd62a1a025f4b0,
707        0xbec976fa2e25f4ab,
708        0x3e61411e4c00a8c3,
709        0x3e61fc07a47b587f,
710        0xbdf8d00a9e1b01e2,
711        0xbdf1119f53145e82,
712        0x3d88b3165222eaa1,
713    ],
714    [
715        0xbc429a344bf53c30,
716        0x3fbf13faf32c8e0a,
717        0xbf570558dddb7821,
718        0xbf94b24d7a9338fa,
719        0x3f2ea52a2144c44d,
720        0x3f50834d8f3f71fa,
721        0xbee86941a2b2f276,
722        0xbef90e32ce46341a,
723        0x3e92785e5b786d2a,
724        0x3e9624822c6837c1,
725        0xbe304286df6c8e25,
726        0xbe2993b44677fad8,
727        0x3dc2692b9cb4de6f,
728        0x3db48dab755272e9,
729    ],
730    [
731        0x3fbe8727daa3daec,
732        0xbc75105fe04e17a2,
733        0xbfae8727daa3d9e9,
734        0x3f3d19c52e0749cd,
735        0x3f74524d481311c0,
736        0xbf0735f790cd464b,
737        0xbf259c8f9e41a823,
738        0x3eba61a00c8699ad,
739        0x3ec896d70eee04c2,
740        0xbe5f04fa0ee2b2df,
741        0xbe6161b9029aa2c1,
742        0x3df656dc5e9fcd6d,
743        0x3df083ab26947d7d,
744        0xbd8646da85095b0a,
745    ],
746    [
747        0x3c40c6e5f0cb085b,
748        0xbfbe018d99f5da1b,
749        0x3f54b85897b35dc0,
750        0x3f93fc44215342e3,
751        0xbf2b9694d7112c4c,
752        0xbf4fe6fdc6440535,
753        0x3ee5fd096c74d7eb,
754        0x3ef83770c8f9fca0,
755        0xbe90a6f608ea2259,
756        0xbe956ad410ba57f4,
757        0x3e2d5aedc8414c7c,
758        0x3e28c319213f9f62,
759        0xbdc0a501a42574f9,
760        0xbdb3eaef334996a5,
761    ],
762    [
763        0xbfbd8293aa55d18f,
764        0x3c731f5b2ff0d80c,
765        0x3fad8293aa55d093,
766        0xbf3a48fe4aff1369,
767        0xbf73a5ccbc11f183,
768        0x3f04f91e4204c18c,
769        0x3f24e72224187971,
770        0xbeb7dac82ed8c06b,
771        0xbec7cbd3d4a2512f,
772        0x3e5c13a012cfa9d9,
773        0x3e60d55d3c7a1e36,
774        0xbdf43f07dbc0afd9,
775        0xbdf001e1c5b3f199,
776        0x3d8438754303f506,
777    ],
778    [
779        0xbc3e721cd5615376,
780        0x3fbd09b210b30217,
781        0xbf52c74f6d11fe58,
782        0xbf9357bfc2be57e6,
783        0x3f2901e4c492a05d,
784        0x3f4ee2a36979201d,
785        0xbee3f0cb91fe387d,
786        0xbef7748920d95467,
787        0x3e8e399ed3001c0e,
788        0x3e94c1b715414ff1,
789        0xbe2aab03479a9f97,
790        0xbe2804415514f135,
791        0x3dbe479692aefaf1,
792        0x3db3555d82fea6b2,
793    ],
794    [
795        0x3fbc96700bf039e1,
796        0xbc71712327ccc0e1,
797        0xbfac96700bf038ec,
798        0x3f37e5647d31307c,
799        0x3f73095734a194a7,
800        0xbf0312a4db676954,
801        0xbf24424a9628de60,
802        0x3eb5b4a67102dd95,
803        0x3ec712e41250bc42,
804        0xbe59918677637160,
805        0xbe60550f5e9164bb,
806        0x3df2750c65ef60c0,
807        0x3def157ced5a6a13,
808        0xbd8274ea409a4ed7,
809    ],
810    [
811        0x3c3bc4a30293d67b,
812        0xbfbc28612a3bc18a,
813        0x3f511f52577ff2df,
814        0x3f92c21da135f4f3,
815        0xbf26ce18f81fd4cd,
816        0xbf4df586d8b6aeb3,
817        0x3ee230fedd1a2b84,
818        0x3ef6c2a754e321b0,
819        0xbe8b973110796ae8,
820        0xbe9426ec6d82a4f4,
821        0x3e285d2ec3ed03c3,
822        0x3e2754eefd1cc277,
823        0xbdbbb13bcfd1095a,
824        0xbdb2cb6d2f5a71d0,
825    ],
826    [
827        0xbfbbbf246914235e,
828        0x3c6ff848b8004f4e,
829        0x3fabbf2469142270,
830        0xbf35d923e8472f22,
831        0xbf727a96f1740b8b,
832        0x3f01715e4bcd425f,
833        0x3f23abacda98c7ab,
834        0xbeb3dc30debc954f,
835        0xbec6698cb2175b00,
836        0x3e57691976ae1f76,
837        0x3e5fbe7a90c59bea,
838        0xbdf0ea1d3534d622,
839        0xbdee39eb617c4576,
840        0x3d80ee68d9ec5553,
841    ],
842    [
843        0xbc396e9c97e8f53c,
844        0x3fbb5a6219b35e14,
845        0xbf4f645fdb1a8578,
846        0xbf923940d01de870,
847        0x3f24e86a1e60f65a,
848        0x3f4d1c6a18c716ef,
849        0xbee0aeec5fff60bb,
850        0xbef61f7d2f793aca,
851        0x3e8950f6140dd479,
852        0x3e939898b4cca68e,
853        0xbe265f0fa2e22f9c,
854        0xbe26b33d2f34a7ca,
855        0x3db9731a4bc752ba,
856        0x3db24bcd6b2996ce,
857    ],
858    [
859        0x3fbaf9cb49c4f934,
860        0xbc6d6d35ce7e44b9,
861        0xbfaaf9cb49c4f84c,
862        0x3f3413b75ce0f622,
863        0x3f71f7a8fec644b8,
864        0xbf000844274ab940,
865        0xbf23215daac1a429,
866        0x3eb242e9f204ac2f,
867        0x3ec5cdc3d7570c8d,
868        0xbe5589d6656d4bd3,
869        0xbe5ee52f2093b13f,
870        0x3def25a4c863585f,
871        0x3ded6edb90588bb5,
872        0xbd7f34526b242536,
873    ],
874    [
875        0x3c37650e44849b1d,
876        0xbfba9d1835947d6f,
877        0x3f4cea253049a1d9,
878        0x3f91bb71f665dc68,
879        0xbf23427f47955327,
880        0xbf4c54a7bd6e5c2f,
881        0x3edebe9e62f23b54,
882        0x3ef58924f95f83e9,
883        0xbe875643b068495f,
884        0xbe93152fe242208c,
885        0x3e24a270e811a32a,
886        0x3e261d90f63d69a9,
887        0xbdb77dbf375b3033,
888        0xbdb1d55983193fd8,
889    ],
890    [
891        0xbfba4407e04298d1,
892        0x3c6b2fc36b7bca2c,
893        0x3faa4407e04297ee,
894        0xbf3288694b34d1f5,
895        0xbf717f0266da7e64,
896        0x3efd9a9a1d244e54,
897        0x3f22a1c915f39e35,
898        0xbeb0dd9e9cd3be0d,
899        0xbec53dd8bf4c31dc,
900        0x3e53e6ebf97ad18c,
901        0x3e5e1c0952edd05e,
902        0xbdeccc874da25bb3,
903        0xbdecb26ccd2d18eb,
904        0x3d7cdf4dbb3c6f9d,
905    ],
906    [
907        0xbc359685a4f3dcbc,
908        0x3fb9ee5ee937fc88,
909        0xbf4abf28ad5bf0d6,
910        0xbf9147481084ad98,
911        0x3f21d137345ad0c1,
912        0x3f4b9c10ddf55248,
913        0xbedc72c9d23eafc6,
914        0xbef4fe0b3595e36e,
915        0x3e859a1afaceaec9,
916        0x3e929b65a8c65855,
917        0xbe231c3162eaeee6,
918        0xbe25928cb280552e,
919        0x3db5c4ff841acff7,
920        0x3db167146fe195c5,
921    ],
922    [
923        0x3fb99be744018c90,
924        0xbc694d1606868f19,
925        0xbfa99be744018bb2,
926        0x3f312d4e1c1cc8e5,
927        0x3f710f5ca51ef993,
928        0xbefb714174938907,
929        0xbf222b9fa834b14b,
930        0x3eaf47107520863c,
931        0x3ec4b861783e33d4,
932        0xbe5276456457a7e2,
933        0xbe5d612d705e69ee,
934        0x3deabad16a1c7f4d,
935        0x3dec0302ce313ca1,
936        0xbd7ad13436da91d1,
937    ],
938    [
939        0x3c33fe4be92d3d54,
940        0xbfb94c6f54aef04b,
941        0x3f48d6371f01895c,
942        0x3f90db975fd7dbd2,
943        0xbf208bd163414db7,
944        0xbf4af0d3d4cc449e,
945        0x3eda6c8e7a6a50d9,
946        0x3ef47cddcd0777cf,
947        0xbe8412382d315a8f,
948        0xbe922a214336182c,
949        0x3e21c37df131e495,
950        0x3e25110597bc5108,
951        0xbdb43f276f813535,
952        0xbdb10022868bfde2,
953    ],
954    [
955        0xbfb8ffc9bd24fe07,
956        0x3c67889977473d30,
957        0x3fa8ffc9bd24fd2f,
958        0xbf2ff51b38ef3764,
959        0xbf70a7a725d36032,
960        0x3ef988128742f09f,
961        0x3f21bdc845f948f5,
962        0xbead1b60b68e1dce,
963        0xbec43c2ce2f40a20,
964        0x3e512fdc8d93240a,
965        0x3e5cb30713086e1b,
966        0xbde8e53a40557273,
967        0xbdeb5f3c07e7903e,
968        0x3d78fd3f37268235,
969    ],
970    [
971        0xbc3292fab12602d5,
972        0x3fb8b5ccad12d631,
973        0xbf4724d018597ba3,
974        0xbf907764ae2b1e77,
975        0x3f1ed6acc18c1a89,
976        0x3f4a51693df22314,
977        0xbed8a0ec5fd8948c,
978        0xbef4047f31589663,
979        0x3e82b667a039f6a4,
980        0x3e91c073e21e1306,
981        0xbe209143960c8785,
982        0xbe2497fb13bc2530,
983        0x3db2e4699f6adc63,
984        0x3db09fc4db2b9fa9,
985    ],
986    [
987        0x3fb86e51be0a9153,
988        0xbc65fa6f95d443a0,
989        0xbfa86e51be0a907f,
990        0x3f2dd3c244b5713f,
991        0x3f7046fc5a20f248,
992        0xbef7d51accd8d1f8,
993        0xbf2157556b6a5aec,
994        0x3eab2d01d207a4bc,
995        0x3ec3c837e1b45aa2,
996        0xbe500d3d097d314b,
997        0xbe5c103c5b331300,
998        0x3de742b129024e6b,
999        0x3deac5e6c8a70206,
1000        0xbd775bdd14ccde28,
1001    ],
1002    [
1003        0x3c314cbdbd279267,
1004        0xbfb829356999a096,
1005        0x3f45a280e033e683,
1006        0x3f9019dba8336dd6,
1007        0xbf1cd4559d92616b,
1008        0xbf49bc85774f69b2,
1009        0x3ed70706561ca508,
1010        0x3ef393fc6c586d81,
1011        0xbe818009f70f6704,
1012        0xbe915d911e7ad3a2,
1013        0x3e1eff8fd0ef6949,
1014        0x3e24268fd4573ff9,
1015        0xbdb1ae6de683a236,
1016        0xbdb0455820923c5a,
1017    ],
1018    [
1019        0xbfb7e656efb009ad,
1020        0x3c649ee393402ee6,
1021        0x3fa7e656efb008de,
1022        0xbf2bec6b33f0062e,
1023        0xbf6fd932c269835b,
1024        0x3ef6504d7e1cd7db,
1025        0x3f20f77ce56ff037,
1026        0xbea972e583ac028d,
1027        0xbec35ba4e79f8507,
1028        0x3e4e1250b982c251,
1029        0x3e5b77a3c340d6b3,
1030        0xbde5cbcf474ee83d,
1031        0xbdea35fa30652af1,
1032        0x3d75e5f83583c368,
1033    ],
1034    [
1035        0xbc375f30b05ffab2,
1036        0x3fb7a597e9550932,
1037        0xbf44486c0b011f0f,
1038        0xbf8f848eec0e0c40,
1039        0x3f1b077fae02763b,
1040        0x3f49310d6e6682f5,
1041        0xbed597a5bccfeb73,
1042        0xbef32a855d113180,
1043        0x3e8069b8fa206f26,
1044        0x3e9100c89784eeac,
1045        0xbe1d14a175c009c5,
1046        0xbe23bbc9bff27ef1,
1047        0x3db0950fae2cbe6f,
1048        0x3dafc6492b94025c,
1049    ],
1050];