# Benchmark results > **Disturbed run.** Other work shared the CPU. After re-timing, 1 sentinel checkpoint remained slow, so some times below are too long. Before quoting them, regenerate the page on a quiet machine with `pixi run --locked report --publish`. This report compares APN Mojo with GMP, MPFR and MPC through Rug, and with FLINT and Arb through python-flint. For the workloads, measurement method, and commands, see [Benchmarks](../contributing/benchmarks.md). ## How these were measured - **Recorded:** 2026-10-06T21:15:38-04:00. This is a snapshot of the stated build, not a measurement of the current checkout. - **Machine:** Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz, CPU 10 only, governor `powersave`, turbo on; Linux 7.0.12-1-t2-noble. - **Software:** apn_mojo 1.0.0, Mojo 1.1.0 (8189361e); GMP 6.3.0, MPFR 4.2.2, MPC 1.4.1 through Rug 1.30.0; FLINT 3.6.0 through python-flint 0.9.0 on Python 3.13.15. - **Correctness:** each case ran once on every backend before timing. Integer, Rational, Float and Complex results must be equal; Float and Complex results are correctly rounded in both libraries. Balls must overlap. 555 of 555 cases agree. - **Timing:** following the timeit protocol, calls increase through 1, 2, 5, 10, ... until a sample takes 10 ms, then 7 samples are collected. The full report gives medians per call; ± is half the interquartile range relative to the median. Inputs are prepared before timing, and each timed call creates and destroys its result without checks. Backends take turns case by case. - **python-flint overhead:** an empty call in the same loop takes 19.7 ns with one argument and 22.8 ns with two. Comparisons with FLINT/Arb subtract it. † marks a call less than four times the overhead; its net time is uncertain. - **Drift:** a sentinel case, Rug's 1024-bit Integer product, was timed every 25 cases; its median varied by 6.5% over the run's 3 min. 2 checkpoints ran more than 15% slow, a sign of other work on the CPU; the 75 cases next to them were timed again. Checkpoints still slow afterwards: 1. The ÷ columns divide APN Mojo's time by the reference's. A ratio below 1 means APN Mojo was faster in that case. ## Summary Each ratio is a geometric mean of APN Mojo / reference times for matching cases whose results agree. **0.5 means half the time; 2 means twice the time.** Averages span the tested sizes and operations, so they are not a prediction for every call. A dash means no comparison; Text conversion has FLINT results only for Integers. | Area | Cases | APN / Rug | APN / FLINT or Arb | |---|---:|---:|---:| | [Integer arithmetic](#integer-arithmetic) | 52 | 1.83 | 0.94 | | [Integer number theory](#integer-number-theory) | 42 | 2.50 | 2.40 | | [Rational arithmetic](#rational-arithmetic) | 18 | 1.08 | 0.72 | | [Float arithmetic](#float-arithmetic) | 40 | 2.43 | – | | [Float functions](#float-functions) | 102 | 1.21 | – | | [Complex arithmetic](#complex-arithmetic) | 21 | 1.89 | – | | [Complex functions](#complex-functions) | 45 | 0.80 | – | | [Ball arithmetic](#ball-arithmetic) | 20 | – | 1.82 | | [Ball functions](#ball-functions) | 85 | – | 2.94 | | [ComplexBall](#complexball) | 30 | – | 2.41 | | [Text conversion](#text-conversion) | 12 | 4.15 | 2.75 | | [Batches of 1000](#batches-of-1000) | 18 | 1.92 | – | | [Hypergeometric functions](#hypergeometric-functions) | 70 | – | 1.31 | ## Integer arithmetic | Operation | Bits | apn_mojo | Rug | ÷ Rug | FLINT/Arb (net) | ÷ FLINT/Arb | |---|---:|---:|---:|---:|---:|---:| | add | 64 | 28.5 ns ±0.9% | 21.9 ns ±3.1% | 1.30 | 43.7 ns † | 0.65 | | subtract | 64 | 25.5 ns ±0.8% | 22.2 ns ±1.7% | 1.15 | 48.5 ns † | 0.53 | | multiply | 64 | 24.2 ns ±0.8% | 21.0 ns ±2.1% | 1.15 | 44.3 ns † | 0.55 | | square | 64 | 21.2 ns ±0.7% | 20.8 ns ±0.9% | 1.02 | 42.4 ns † | 0.50 | | floordiv | 64 | 28.4 ns ±1.1% | 30.9 ns ±1.0% | 0.92 | 51.9 ns † | 0.55 | | mod | 64 | 26.1 ns ±2.0% | 31.6 ns ±0.3% | 0.82 | 53.1 ns † | 0.49 | | and | 64 | 24.0 ns ±1.1% | 19.4 ns ±1.2% | 1.24 | 58.5 ns † | 0.41 | | or | 64 | 35.2 ns ±28.9% | 22.4 ns ±3.7% | 1.57 | 59.7 ns † | 0.59 | | xor | 64 | 42.8 ns ±33.6% | 40.8 ns ±16.5% | 1.05 | 122 ns | 0.35 | | shift_left | 64 | 49.1 ns ±20.8% | 38.8 ns ±14.9% | 1.26 | 73.3 ns | 0.67 | | shift_right | 64 | 23.0 ns ±0.6% | 21.6 ns ±0.2% | 1.06 | 74.7 ns | 0.31 | | floordiv_small | 64 | 28.3 ns ±1.5% | 31.3 ns ±0.7% | 0.90 | 50.6 ns † | 0.56 | | add | 256 | 26.6 ns ±0.4% | 22.2 ns ±0.7% | 1.20 | 48.1 ns † | 0.55 | | subtract | 256 | 31.0 ns ±0.9% | 23.7 ns ±2.1% | 1.31 | 50.3 ns † | 0.62 | | multiply | 256 | 44.7 ns ±2.4% | 34.0 ns ±1.4% | 1.31 | 52.1 ns † | 0.86 | | square | 256 | 44.1 ns ±1.3% | 28.6 ns ±1.0% | 1.54 | 57.1 ns † | 0.77 | | floordiv | 256 | 107 ns ±0.6% | 45.5 ns ±0.7% | 2.35 | 107 ns | 1.00 | | mod | 256 | 104 ns ±3.4% | 75.2 ns ±1.8% | 1.39 | 106 ns | 0.98 | | and | 256 | 35.8 ns ±0.6% | 18.9 ns ±1.0% | 1.89 | 49.4 ns † | 0.73 | | or | 256 | 37.0 ns ±0.9% | 22.4 ns ±1.2% | 1.65 | 48.9 ns † | 0.76 | | xor | 256 | 37.3 ns ±0.7% | 22.2 ns ±1.0% | 1.68 | 52.2 ns † | 0.72 | | shift_left | 256 | 31.5 ns ±1.0% | 21.8 ns ±1.1% | 1.44 | 77.3 ns | 0.41 | | shift_right | 256 | 34.9 ns ±0.6% | 22.0 ns ±1.7% | 1.59 | 74.6 ns | 0.47 | | floordiv_small | 256 | 46.1 ns ±0.9% | 40.5 ns ±0.8% | 1.14 | 55.7 ns † | 0.83 | | add | 1024 | 33.4 ns ±0.8% | 25.1 ns ±1.5% | 1.33 | 52.1 ns † | 0.64 | | subtract | 1024 | 40.5 ns ±0.9% | 25.5 ns ±1.6% | 1.59 | 52.5 ns † | 0.77 | | multiply | 1024 | 188 ns ±0.5% | 155 ns ±1.2% | 1.21 | 185 ns | 1.02 | | square | 1024 | 184 ns ±0.8% | 98.7 ns ±0.5% | 1.87 | 128 ns | 1.44 | | floordiv | 1024 | 178 ns ±0.6% | 48.1 ns ±1.5% | 3.70 | 116 ns | 1.54 | | mod | 1024 | 173 ns ±0.6% | 81.2 ns ±0.8% | 2.13 | 117 ns | 1.48 | | and | 1024 | 66.6 ns ±1.3% | 21.5 ns ±0.6% | 3.10 | 50.5 ns † | 1.32 | | or | 1024 | 68.9 ns ±1.4% | 24.9 ns ±2.4% | 2.77 | 52.2 ns † | 1.32 | | xor | 1024 | 67.6 ns ±0.7% | 25.5 ns ±1.4% | 2.65 | 53.1 ns † | 1.27 | | shift_left | 1024 | 38.2 ns ±0.9% | 25.0 ns ±1.4% | 1.53 | 77.1 ns | 0.50 | | shift_right | 1024 | 52.9 ns ±0.6% | 25.3 ns ±2.4% | 2.09 | 79.9 ns | 0.66 | | floordiv_small | 1024 | 90.3 ns ±1.2% | 70.0 ns ±1.4% | 1.29 | 87.4 ns | 1.03 | | add | 4096 | 64.6 ns ±1.6% | 35.4 ns ±0.3% | 1.83 | 115 ns | 0.56 | | subtract | 4096 | 78.6 ns ±0.4% | 36.6 ns ±0.6% | 2.15 | 108 ns | 0.73 | | multiply | 4096 | 2.27 µs ±0.6% | 1.48 µs ±1.7% | 1.53 | 1.56 µs | 1.45 | | square | 4096 | 2.07 µs ±0.9% | 933 ns ±1.1% | 2.22 | 1.00 µs | 2.07 | | floordiv | 4096 | 493 ns ±0.6% | 47.3 ns ±0.6% | 10.42 | 150 ns | 3.30 | | mod | 4096 | 491 ns ±0.5% | 117 ns ±0.4% | 4.21 | 149 ns | 3.29 | | and | 4096 | 197 ns ±0.4% | 37.1 ns ±0.4% | 5.32 | 65.9 ns † | 3.00 | | or | 4096 | 200 ns ±0.8% | 40.3 ns ±1.7% | 4.97 | 65.1 ns † | 3.08 | | xor | 4096 | 198 ns ±1.9% | 39.5 ns ±1.1% | 5.01 | 67.6 ns † | 2.93 | | shift_left | 4096 | 61.9 ns ±0.8% | 35.5 ns ±0.7% | 1.74 | 148 ns | 0.42 | | shift_right | 4096 | 125 ns ±0.9% | 35.7 ns ±1.8% | 3.50 | 134 ns | 0.93 | | floordiv_small | 4096 | 267 ns ±1.7% | 194 ns ±0.8% | 1.37 | 214 ns | 1.25 | | multiply | 16384 | 23.9 µs ±0.9% | 12.2 µs ±0.8% | 1.95 | 12.5 µs | 1.91 | | floordiv | 16384 | 61.6 µs ±1.4% | 31.0 µs ±0.5% | 1.98 | 24.7 µs | 2.49 | | multiply | 65536 | 223 µs ±0.4% | 87.4 µs ±1.0% | 2.55 | 89.4 µs | 2.49 | | floordiv | 65536 | 941 µs ±0.6% | 253 µs ±1.2% | 3.71 | 222 µs | 4.24 | ## Integer number theory | Operation | Bits | apn_mojo | Rug | ÷ Rug | FLINT/Arb (net) | ÷ FLINT/Arb | |---|---:|---:|---:|---:|---:|---:| | gcd | 64 | 61.0 ns ±0.7% | 64.3 ns ±0.6% | 0.95 | 74.1 ns | 0.82 | | gcd_small | 64 | 45.8 ns ±0.5% | 52.3 ns ±0.6% | 0.87 | 60.6 ns † | 0.76 | | lcm | 64 | 105 ns ±1.2% | 82.1 ns ±1.7% | 1.28 | 131 ns | 0.80 | | isqrt | 64 | 53.2 ns ±1.7% | 21.3 ns ±2.2% | 2.50 | 62.9 ns | 0.85 | | iroot | 64 | 101 ns ±1.0% | 139 ns ±0.6% | 0.73 | 205 ns | 0.49 | | div_exact | 64 | 56.4 ns ±1.6% | 25.4 ns ±0.6% | 2.22 | 51.1 ns † | 1.10 | | inverse_mod | 64 | 933 ns ±1.4% | 342 ns ±1.8% | 2.73 | 416 ns | 2.24 | | pow_mod | 64 | 3.55 µs ±0.7% | 340 ns ±2.5% | 10.44 | 418 ns | 8.48 | | is_prime | 64 | 21.9 µs ±1.0% | 2.90 µs ±0.8% | 7.56 | 431 ns | 50.91 | | gcd | 256 | 535 ns ±0.6% | 632 ns ±0.5% | 0.85 | 719 ns | 0.74 | | gcd_small | 256 | 54.9 ns ±0.1% | 51.7 ns ±0.4% | 1.06 | 68.2 ns † | 0.81 | | lcm | 256 | 691 ns ±4.8% | 694 ns ±1.0% | 1.00 | 1.40 µs | 0.49 | | isqrt | 256 | 240 ns ±16.9% | 107 ns ±12.3% | 2.25 | 201 ns | 1.19 | | iroot | 256 | 259 ns ±1.1% | 260 ns ±1.3% | 1.00 | 588 ns | 0.44 | | div_exact | 256 | 146 ns ±1.6% | 59.8 ns ±0.3% | 2.45 | 111 ns | 1.32 | | inverse_mod | 256 | 16.8 µs ±0.7% | 905 ns ±0.7% | 18.54 | 1.15 µs | 14.63 | | pow_mod | 256 | 73.4 µs ±0.3% | 9.16 µs ±0.4% | 8.02 | 9.54 µs | 7.70 | | is_prime | 256 | 372 µs ±0.6% | 65.1 µs ±1.8% | 5.70 | 41.0 µs | 9.06 | | gcd | 1024 | 2.60 µs ±2.2% | 3.07 µs ±0.6% | 0.85 | 3.37 µs | 0.77 | | gcd_small | 1024 | 96.0 ns ±0.2% | 71.2 ns ±1.2% | 1.35 | 88.1 ns | 1.09 | | lcm | 1024 | 2.82 µs ±0.9% | 3.23 µs ±0.4% | 0.87 | 3.60 µs | 0.78 | | isqrt | 1024 | 362 ns ±0.7% | 207 ns ±0.8% | 1.75 | 273 ns | 1.33 | | iroot | 1024 | 733 ns ±0.3% | 562 ns ±1.9% | 1.30 | 659 ns | 1.11 | | div_exact | 1024 | 523 ns ±0.3% | 147 ns ±3.0% | 3.56 | 332 ns | 1.58 | | inverse_mod | 1024 | 106 µs ±0.7% | 3.76 µs ±0.4% | 28.08 | 4.11 µs | 25.72 | | pow_mod | 1024 | 1.05 ms ±1.2% | 306 µs ±0.8% | 3.44 | 309 µs | 3.41 | | is_prime | 1024 | 4.46 ms ±1.5% | 1.14 ms ±0.5% | 3.90 | 949 µs | 4.70 | | gcd | 4096 | 16.1 µs ±1.1% | 16.1 µs ±0.6% | 1.00 | 18.3 µs | 0.88 | | gcd_small | 4096 | 276 ns ±1.1% | 257 ns ±0.8% | 1.07 | 295 ns | 0.94 | | lcm | 4096 | 18.1 µs ±2.5% | 17.8 µs ±0.3% | 1.01 | 19.3 µs | 0.94 | | isqrt | 4096 | 1.24 µs ±0.8% | 615 ns ±0.6% | 2.02 | 683 ns | 1.82 | | iroot | 4096 | 3.09 µs ±0.7% | 1.15 µs ±0.3% | 2.70 | 1.24 µs | 2.50 | | div_exact | 4096 | 4.70 µs ±2.0% | 1.34 µs ±1.2% | 3.50 | 2.64 µs | 1.78 | | inverse_mod | 4096 | 905 µs ±1.4% | 22.4 µs ±0.8% | 40.50 | 25.1 µs | 36.06 | | factorial | n = 20 | 12.9 ns ±1.4% | 18.7 ns ±0.3% | 0.69 | 27.6 ns † | 0.47 | | binomial | n = 20 | 218 ns ±2.3% | 171 ns ±1.4% | 1.28 | 53.4 ns † | 4.08 | | factorial | n = 100 | 120 ns ±1.1% | 82.7 ns ±0.9% | 1.45 | 110 ns | 1.10 | | binomial | n = 100 | 3.25 µs ±0.8% | 563 ns ±1.1% | 5.76 | 112 ns | 28.89 | | factorial | n = 1000 | 5.80 µs ±1.1% | 3.63 µs ±1.7% | 1.60 | 3.62 µs | 1.60 | | binomial | n = 1000 | 57.9 µs ±0.4% | 5.58 µs ±0.1% | 10.39 | 1.97 µs | 29.40 | | factorial | n = 10000 | 510 µs ±2.2% | 180 µs ±0.9% | 2.83 | 182 µs | 2.80 | | binomial | n = 10000 | 3.00 ms ±1.5% | 201 µs ±0.9% | 14.88 | 16.3 µs | 183.65 | ## Rational arithmetic | Operation | Bits | apn_mojo | Rug | ÷ Rug | FLINT/Arb (net) | ÷ FLINT/Arb | |---|---:|---:|---:|---:|---:|---:| | add | 64 | 51.7 ns ±0.3% | 87.7 ns ±0.8% | 0.59 | 165 ns | 0.31 | | subtract | 64 | 52.9 ns ±0.5% | 88.5 ns ±0.3% | 0.60 | 161 ns | 0.33 | | multiply | 64 | 94.6 ns ±0.7% | 140 ns ±0.6% | 0.67 | 204 ns | 0.46 | | divide | 64 | 126 ns ±1.0% | 149 ns ±1.1% | 0.85 | 308 ns | 0.41 | | square | 64 | 33.0 ns ±0.6% | 45.1 ns ±0.7% | 0.73 | 96.3 ns | 0.34 | | pow_int | 64 | 114 ns ±2.4% | 95.5 ns ±0.6% | 1.19 | 132 ns | 0.87 | | add | 256 | 377 ns ±0.6% | 304 ns ±2.1% | 1.24 | 427 ns | 0.88 | | subtract | 256 | 380 ns ±1.7% | 311 ns ±1.7% | 1.22 | 421 ns | 0.90 | | multiply | 256 | 939 ns ±1.2% | 527 ns ±0.7% | 1.78 | 689 ns | 1.36 | | divide | 256 | 1.04 µs ±2.7% | 949 ns ±1.7% | 1.09 | 1.43 µs | 0.73 | | square | 256 | 135 ns ±0.4% | 89.8 ns ±0.2% | 1.50 | 168 ns | 0.80 | | pow_int | 256 | 246 ns ±0.5% | 155 ns ±1.3% | 1.59 | 185 ns | 1.33 | | add | 1024 | 1.63 µs ±2.3% | 1.64 µs ±0.8% | 0.99 | 1.99 µs | 0.82 | | subtract | 1024 | 1.62 µs ±0.4% | 1.61 µs ±1.9% | 1.01 | 1.98 µs | 0.82 | | multiply | 1024 | 3.39 µs ±1.5% | 3.15 µs ±0.5% | 1.08 | 3.74 µs | 0.91 | | divide | 1024 | 4.23 µs ±2.8% | 4.58 µs ±1.2% | 0.93 | 5.49 µs | 0.77 | | square | 1024 | 329 ns ±0.3% | 151 ns ±1.0% | 2.18 | 341 ns | 0.97 | | pow_int | 1024 | 806 ns ±1.1% | 589 ns ±1.7% | 1.37 | 630 ns | 1.28 | ## Float arithmetic | Operation | Bits | apn_mojo | Rug | ÷ Rug | |---|---:|---:|---:|---:| | add | 53 | 35.8 ns ±0.9% | 24.2 ns ±0.7% | 1.48 | | subtract | 53 | 35.8 ns ±0.3% | 27.0 ns ±0.8% | 1.32 | | multiply | 53 | 28.1 ns ±0.3% | 24.2 ns ±2.4% | 1.16 | | divide | 53 | 39.7 ns ±0.7% | 26.5 ns ±0.8% | 1.50 | | square | 53 | 25.0 ns ±0.6% | 22.8 ns ±0.8% | 1.10 | | sqrt | 53 | 40.2 ns ±0.9% | 27.0 ns ±0.4% | 1.49 | | fma | 53 | 85.7 ns ±0.3% | 37.6 ns ±0.8% | 2.28 | | pow_int | 53 | 372 ns ±0.7% | 122 ns ±0.4% | 3.06 | | add | 113 | 90.1 ns ±1.3% | 26.3 ns ±0.6% | 3.42 | | subtract | 113 | 91.0 ns ±1.1% | 26.2 ns ±0.6% | 3.47 | | multiply | 113 | 79.7 ns ±20.6% | 38.7 ns ±20.6% | 2.06 | | divide | 113 | 241 ns ±13.4% | 62.4 ns ±5.2% | 3.86 | | square | 113 | 102 ns ±10.7% | 42.3 ns ±10.6% | 2.41 | | sqrt | 113 | 165 ns ±1.5% | 31.7 ns ±0.9% | 5.22 | | fma | 113 | 200 ns ±0.5% | 57.1 ns ±0.3% | 3.51 | | pow_int | 113 | 634 ns ±0.0% | 154 ns ±0.2% | 4.11 | | add | 256 | 82.3 ns ±0.2% | 29.5 ns ±0.2% | 2.79 | | subtract | 256 | 86.4 ns ±0.1% | 41.0 ns ±0.2% | 2.11 | | multiply | 256 | 99.6 ns ±0.2% | 44.7 ns ±0.4% | 2.23 | | divide | 256 | 207 ns ±0.5% | 82.4 ns ±0.9% | 2.51 | | square | 256 | 88.1 ns ±0.9% | 41.5 ns ±0.8% | 2.12 | | sqrt | 256 | 385 ns ±0.1% | 167 ns ±0.3% | 2.31 | | fma | 256 | 209 ns ±0.5% | 59.1 ns ±0.4% | 3.54 | | pow_int | 256 | 1.53 µs ±0.1% | 260 ns ±0.1% | 5.88 | | add | 1024 | 99.9 ns ±0.1% | 43.0 ns ±0.1% | 2.32 | | subtract | 1024 | 115 ns ±0.6% | 54.6 ns ±0.5% | 2.10 | | multiply | 1024 | 256 ns ±1.2% | 166 ns ±0.4% | 1.54 | | divide | 1024 | 541 ns ±0.3% | 233 ns ±0.8% | 2.32 | | square | 1024 | 240 ns ±1.6% | 128 ns ±0.8% | 1.88 | | sqrt | 1024 | 635 ns ±1.7% | 390 ns ±0.4% | 1.63 | | fma | 1024 | 398 ns ±0.3% | 209 ns ±0.2% | 1.90 | | pow_int | 1024 | 7.66 µs ±0.3% | 955 ns ±0.1% | 8.02 | | add | 4096 | 178 ns ±0.1% | 98.6 ns ±0.1% | 1.81 | | subtract | 4096 | 192 ns ±1.5% | 73.1 ns ±0.7% | 2.63 | | multiply | 4096 | 1.74 µs ±0.2% | 1.26 µs ±2.5% | 1.39 | | divide | 4096 | 4.71 µs ±1.1% | 1.67 µs ±0.6% | 2.83 | | square | 4096 | 2.30 µs ±1.8% | 763 ns ±0.2% | 3.01 | | sqrt | 4096 | 3.83 µs ±0.2% | 1.45 µs ±0.2% | 2.64 | | fma | 4096 | 2.81 µs ±0.2% | 1.66 µs ±0.1% | 1.69 | | pow_int | 4096 | 41.7 µs ±0.9% | 7.31 µs ±0.4% | 5.71 | ## Float functions | Operation | Bits | apn_mojo | Rug | ÷ Rug | |---|---:|---:|---:|---:| | exp | 53 | 1.45 µs ±0.7% | 635 ns ±0.4% | 2.28 | | expm1 | 53 | 1.31 µs ±1.0% | 694 ns ±1.1% | 1.89 | | exp2 | 53 | 3.32 µs ±4.2% | 828 ns ±0.6% | 4.01 | | log | 53 | 1.14 µs ±0.7% | 665 ns ±1.9% | 1.71 | | log1p | 53 | 1.29 µs ±0.3% | 740 ns ±0.1% | 1.74 | | log2 | 53 | 1.42 µs ±1.1% | 766 ns ±0.2% | 1.85 | | log10 | 53 | 4.02 µs ±0.3% | 1.41 µs ±0.1% | 2.85 | | sin | 53 | 1.55 µs ±1.4% | 713 ns ±2.5% | 2.17 | | cos | 53 | 1.55 µs ±2.0% | 509 ns ±0.5% | 3.05 | | tan | 53 | 1.90 µs ±0.5% | 836 ns ±0.4% | 2.27 | | atan | 53 | 1.10 µs ±0.8% | 1.65 µs ±2.0% | 0.67 | | asin | 53 | 2.19 µs ±0.1% | 1.82 µs ±0.1% | 1.20 | | acos | 53 | 2.60 µs ±0.3% | 1.86 µs ±0.2% | 1.40 | | sinh | 53 | 2.02 µs ±0.1% | 2.31 µs ±0.5% | 0.88 | | cosh | 53 | 1.88 µs ±0.1% | 813 ns ±0.6% | 2.31 | | tanh | 53 | 1.87 µs ±0.8% | 898 ns ±1.0% | 2.08 | | asinh | 53 | 1.68 µs ±0.6% | 817 ns ±2.3% | 2.06 | | acosh | 53 | 1.89 µs ±0.8% | 808 ns ±1.0% | 2.34 | | atanh | 53 | 2.39 µs ±0.4% | 2.70 µs ±0.1% | 0.88 | | gamma | 53 | 3.68 µs ±0.2% | 3.33 µs ±0.6% | 1.11 | | gammaln | 53 | 15.4 µs ±0.3% | 3.20 µs ±0.1% | 4.81 | | digamma | 53 | 6.58 µs ±0.6% | 1.72 µs ±0.2% | 3.83 | | erf | 53 | 18.7 µs ±0.8% | 1.98 µs ±0.6% | 9.46 | | erfc | 53 | 36.7 µs ±0.5% | 14.8 µs ±0.4% | 2.49 | | expi | 53 | 33.0 µs ±1.4% | 26.2 µs ±0.3% | 1.26 | | atan2 | 53 | 1.72 µs ±0.1% | 1.81 µs ±0.1% | 0.95 | | pow | 53 | 5.02 µs ±0.3% | 1.59 µs ±0.3% | 3.16 | | exp | 256 | 2.36 µs ±2.3% | 1.81 µs ±0.1% | 1.30 | | expm1 | 256 | 2.12 µs ±2.3% | 1.86 µs ±0.9% | 1.14 | | exp2 | 256 | 7.81 µs ±0.8% | 1.76 µs ±0.8% | 4.43 | | log | 256 | 1.60 µs ±0.6% | 2.96 µs ±0.5% | 0.54 | | log1p | 256 | 1.78 µs ±0.3% | 3.00 µs ±1.0% | 0.60 | | log2 | 256 | 2.12 µs ±0.2% | 3.08 µs ±0.2% | 0.69 | | log10 | 256 | 8.02 µs ±0.4% | 6.47 µs ±0.2% | 1.24 | | sin | 256 | 2.38 µs ±0.1% | 1.89 µs ±0.1% | 1.26 | | cos | 256 | 2.64 µs ±0.4% | 1.53 µs ±0.1% | 1.72 | | tan | 256 | 2.93 µs ±0.1% | 2.06 µs ±0.2% | 1.42 | | atan | 256 | 1.79 µs ±0.2% | 7.32 µs ±0.1% | 0.24 | | asin | 256 | 3.38 µs ±0.1% | 9.52 µs ±0.1% | 0.35 | | acos | 256 | 4.44 µs ±0.2% | 9.95 µs ±0.3% | 0.45 | | sinh | 256 | 3.18 µs ±0.2% | 1.96 µs ±0.8% | 1.62 | | cosh | 256 | 2.83 µs ±0.1% | 1.92 µs ±0.1% | 1.47 | | tanh | 256 | 3.07 µs ±0.7% | 2.06 µs ±0.7% | 1.49 | | asinh | 256 | 2.81 µs ±1.3% | 3.35 µs ±0.5% | 0.84 | | acosh | 256 | 2.79 µs ±1.9% | 3.32 µs ±0.5% | 0.84 | | atanh | 256 | 2.57 µs ±0.2% | 3.29 µs ±0.4% | 0.78 | | gamma | 256 | 6.39 µs ±0.4% | 20.2 µs ±0.1% | 0.32 | | gammaln | 256 | 29.5 µs ±0.3% | 18.2 µs ±0.2% | 1.61 | | digamma | 256 | 16.2 µs ±0.1% | 50.2 µs ±0.1% | 0.32 | | erf | 256 | 51.3 µs ±0.7% | 11.8 µs ±0.2% | 4.35 | | erfc | 256 | 29.2 µs ±2.4% | 5.42 µs ±0.7% | 5.38 | | expi | 256 | 92.1 µs ±17.0% | 34.5 µs ±5.5% | 2.67 | | atan2 | 256 | 4.57 µs ±15.5% | 8.77 µs ±26.3% | 0.52 | | pow | 256 | 10.9 µs ±16.7% | 8.68 µs ±15.4% | 1.26 | | exp | 1024 | 12.5 µs ±19.5% | 14.8 µs ±18.9% | 0.84 | | expm1 | 1024 | 7.74 µs ±1.0% | 8.40 µs ±17.3% | 0.92 | | exp2 | 1024 | 19.8 µs ±0.6% | 8.21 µs ±0.3% | 2.41 | | log | 1024 | 5.95 µs ±1.3% | 9.72 µs ±0.4% | 0.61 | | log1p | 1024 | 6.32 µs ±0.5% | 9.77 µs ±0.8% | 0.65 | | log2 | 1024 | 7.54 µs ±0.6% | 10.0 µs ±2.0% | 0.75 | | log10 | 1024 | 24.9 µs ±1.2% | 19.5 µs ±0.4% | 1.27 | | sin | 1024 | 8.47 µs ±0.7% | 8.01 µs ±0.5% | 1.06 | | cos | 1024 | 9.01 µs ±0.9% | 6.69 µs ±1.3% | 1.35 | | tan | 1024 | 10.0 µs ±0.4% | 8.03 µs ±0.5% | 1.25 | | atan | 1024 | 7.73 µs ±1.5% | 21.2 µs ±0.3% | 0.37 | | asin | 1024 | 9.84 µs ±1.2% | 23.6 µs ±0.8% | 0.42 | | acos | 1024 | 11.1 µs ±0.7% | 29.3 µs ±0.9% | 0.38 | | sinh | 1024 | 9.57 µs ±0.5% | 8.27 µs ±1.5% | 1.16 | | cosh | 1024 | 8.78 µs ±0.6% | 8.18 µs ±2.2% | 1.07 | | tanh | 1024 | 8.91 µs ±1.1% | 8.40 µs ±0.5% | 1.06 | | asinh | 1024 | 8.50 µs ±1.0% | 10.2 µs ±0.6% | 0.83 | | acosh | 1024 | 8.65 µs ±1.0% | 10.2 µs ±0.2% | 0.85 | | atanh | 1024 | 7.73 µs ±1.1% | 9.87 µs ±0.4% | 0.78 | | gamma | 1024 | 43.5 µs ±0.8% | 142 µs ±1.5% | 0.31 | | gammaln | 1024 | 119 µs ±1.3% | 150 µs ±4.9% | 0.80 | | digamma | 1024 | 118 µs ±0.9% | 539 µs ±2.5% | 0.22 | | erf | 1024 | 168 µs ±0.4% | 66.2 µs ±0.8% | 2.54 | | erfc | 1024 | 221 µs ±1.3% | 87.6 µs ±1.8% | 2.52 | | expi | 1024 | 208 µs ±0.5% | 82.2 µs ±0.4% | 2.53 | | atan2 | 1024 | 8.45 µs ±0.9% | 30.6 µs ±0.8% | 0.28 | | pow | 1024 | 18.7 µs ±1.3% | 18.2 µs ±1.0% | 1.03 | | exp | 4096 | 84.2 µs ±1.1% | 78.1 µs ±1.0% | 1.08 | | expm1 | 4096 | 80.0 µs ±1.6% | 78.0 µs ±5.2% | 1.03 | | exp2 | 4096 | 151 µs ±0.4% | 80.5 µs ±0.8% | 1.88 | | log | 4096 | 91.1 µs ±1.1% | 62.6 µs ±2.9% | 1.46 | | log1p | 4096 | 90.4 µs ±1.0% | 55.2 µs ±1.2% | 1.64 | | log2 | 4096 | 90.5 µs ±0.7% | 60.5 µs ±1.9% | 1.50 | | log10 | 4096 | 195 µs ±0.9% | 112 µs ±0.6% | 1.75 | | sin | 4096 | 103 µs ±0.7% | 76.3 µs ±0.8% | 1.34 | | cos | 4096 | 95.8 µs ±0.6% | 70.4 µs ±0.5% | 1.36 | | tan | 4096 | 104 µs ±2.1% | 77.9 µs ±0.6% | 1.34 | | atan | 4096 | 95.6 µs ±6.8% | 153 µs ±0.6% | 0.63 | | asin | 4096 | 103 µs ±0.5% | 168 µs ±0.7% | 0.62 | | acos | 4096 | 113 µs ±0.2% | 162 µs ±0.5% | 0.70 | | sinh | 4096 | 91.3 µs ±1.9% | 85.3 µs ±2.7% | 1.07 | | cosh | 4096 | 87.3 µs ±0.9% | 72.2 µs ±0.7% | 1.21 | | tanh | 4096 | 94.5 µs ±0.2% | 84.7 µs ±6.5% | 1.12 | | asinh | 4096 | 97.0 µs ±1.8% | 57.7 µs ±1.1% | 1.68 | | acosh | 4096 | 97.9 µs ±0.4% | 57.8 µs ±0.2% | 1.69 | | atanh | 4096 | 97.3 µs ±0.4% | 56.7 µs ±0.7% | 1.72 | | atan2 | 4096 | 104 µs ±1.1% | 156 µs ±3.1% | 0.66 | | pow | 4096 | 187 µs ±0.3% | 141 µs ±2.5% | 1.32 | ## Complex arithmetic | Operation | Bits | apn_mojo | Rug | ÷ Rug | |---|---:|---:|---:|---:| | add | 53 | 91.8 ns ±0.4% | 43.5 ns ±0.8% | 2.11 | | subtract | 53 | 91.1 ns ±0.9% | 43.3 ns ±0.3% | 2.10 | | multiply | 53 | 125 ns ±0.5% | 128 ns ±1.2% | 0.98 | | divide | 53 | 250 ns ±0.8% | 507 ns ±0.5% | 0.49 | | square | 53 | 127 ns ±2.1% | 162 ns ±0.7% | 0.78 | | sqrt | 53 | 338 ns ±0.9% | 290 ns ±0.3% | 1.16 | | pow_int | 53 | 44.5 µs ±0.8% | 9.59 µs ±2.1% | 4.64 | | add | 256 | 238 ns ±0.1% | 59.9 ns ±0.3% | 3.97 | | subtract | 256 | 266 ns ±0.0% | 64.7 ns ±0.2% | 4.11 | | multiply | 256 | 546 ns ±0.1% | 241 ns ±0.2% | 2.27 | | divide | 256 | 2.46 µs ±0.1% | 1.07 µs ±0.2% | 2.31 | | square | 256 | 549 ns ±0.2% | 318 ns ±1.6% | 1.73 | | sqrt | 256 | 1.58 µs ±1.2% | 716 ns ±1.1% | 2.20 | | pow_int | 256 | 51.7 µs ±0.5% | 38.8 µs ±0.8% | 1.33 | | add | 1024 | 387 ns ±2.5% | 69.1 ns ±0.8% | 5.60 | | subtract | 1024 | 371 ns ±0.9% | 68.2 ns ±1.0% | 5.44 | | multiply | 1024 | 1.24 µs ±0.2% | 809 ns ±2.2% | 1.53 | | divide | 1024 | 4.58 µs ±0.6% | 2.31 µs ±0.4% | 1.98 | | square | 1024 | 1.21 µs ±0.4% | 627 ns ±2.0% | 1.93 | | sqrt | 1024 | 3.36 µs ±0.6% | 1.59 µs ±2.7% | 2.12 | | pow_int | 1024 | 76.3 µs ±0.5% | 173 µs ±0.5% | 0.44 | ## Complex functions | Operation | Bits | apn_mojo | Rug | ÷ Rug | |---|---:|---:|---:|---:| | exp | 53 | 2.65 µs ±0.8% | 1.85 µs ±0.7% | 1.43 | | log | 53 | 3.87 µs ±1.1% | 2.60 µs ±1.7% | 1.49 | | sin | 53 | 4.51 µs ±0.9% | 1.69 µs ±0.5% | 2.67 | | cos | 53 | 3.97 µs ±1.2% | 1.78 µs ±1.9% | 2.23 | | tan | 53 | 4.71 µs ±1.2% | 6.35 µs ±0.8% | 0.74 | | sinh | 53 | 3.82 µs ±0.7% | 1.77 µs ±2.5% | 2.15 | | cosh | 53 | 3.72 µs ±0.4% | 1.81 µs ±1.3% | 2.05 | | tanh | 53 | 4.61 µs ±0.6% | 2.87 µs ±1.3% | 1.61 | | asin | 53 | 6.97 µs ±0.9% | 7.70 µs ±0.5% | 0.91 | | acos | 53 | 8.89 µs ±0.5% | 8.68 µs ±0.6% | 1.02 | | atan | 53 | 6.62 µs ±0.3% | 6.72 µs ±1.7% | 0.99 | | asinh | 53 | 7.14 µs ±0.6% | 7.74 µs ±0.9% | 0.92 | | acosh | 53 | 10.2 µs ±1.2% | 8.53 µs ±0.6% | 1.19 | | atanh | 53 | 5.48 µs ±0.3% | 5.22 µs ±0.8% | 1.05 | | pow | 53 | 6.29 µs ±1.8% | 18.6 µs ±0.8% | 0.34 | | exp | 256 | 4.97 µs ±1.6% | 5.35 µs ±0.5% | 0.93 | | log | 256 | 5.24 µs ±0.4% | 12.1 µs ±0.0% | 0.43 | | sin | 256 | 12.6 µs ±20.9% | 4.66 µs ±10.0% | 2.71 | | cos | 256 | 12.7 µs ±4.1% | 7.51 µs ±12.4% | 1.70 | | tan | 256 | 14.2 µs ±6.0% | 6.67 µs ±1.9% | 2.13 | | sinh | 256 | 8.11 µs ±18.6% | 4.43 µs ±1.1% | 1.83 | | cosh | 256 | 6.21 µs ±2.6% | 4.54 µs ±0.6% | 1.37 | | tanh | 256 | 8.48 µs ±1.8% | 6.27 µs ±0.4% | 1.35 | | asin | 256 | 10.3 µs ±0.3% | 152 µs ±0.7% | 0.07 | | acos | 256 | 10.9 µs ±3.2% | 30.7 µs ±1.5% | 0.36 | | atan | 256 | 8.68 µs ±1.6% | 26.1 µs ±0.6% | 0.33 | | asinh | 256 | 9.64 µs ±0.7% | 29.6 µs ±0.8% | 0.33 | | acosh | 256 | 13.7 µs ±2.4% | 26.4 µs ±0.4% | 0.52 | | atanh | 256 | 7.52 µs ±0.7% | 22.4 µs ±0.1% | 0.34 | | pow | 256 | 11.5 µs ±1.0% | 19.5 µs ±0.9% | 0.59 | | exp | 1024 | 16.9 µs ±0.7% | 28.9 µs ±1.0% | 0.58 | | log | 1024 | 16.3 µs ±0.5% | 38.6 µs ±1.5% | 0.42 | | sin | 1024 | 20.0 µs ±0.9% | 16.7 µs ±0.9% | 1.20 | | cos | 1024 | 19.5 µs ±0.4% | 16.5 µs ±0.3% | 1.18 | | tan | 1024 | 21.5 µs ±1.3% | 20.5 µs ±2.9% | 1.05 | | sinh | 1024 | 19.9 µs ±2.6% | 17.1 µs ±0.8% | 1.16 | | cosh | 1024 | 19.2 µs ±0.4% | 16.7 µs ±0.9% | 1.15 | | tanh | 1024 | 23.7 µs ±1.8% | 20.6 µs ±0.4% | 1.15 | | asin | 1024 | 24.7 µs ±0.6% | 83.3 µs ±1.0% | 0.30 | | acos | 1024 | 26.2 µs ±0.3% | 80.5 µs ±1.3% | 0.33 | | atan | 1024 | 21.5 µs ±0.8% | 70.4 µs ±0.9% | 0.31 | | asinh | 1024 | 25.2 µs ±0.4% | 37.5 µs ±0.8% | 0.67 | | acosh | 1024 | 31.0 µs ±0.4% | 42.1 µs ±1.3% | 0.74 | | atanh | 1024 | 20.8 µs ±1.4% | 79.9 µs ±0.4% | 0.26 | | pow | 1024 | 33.2 µs ±0.5% | 168 µs ±1.5% | 0.20 | ## Ball arithmetic | Operation | Bits | apn_mojo | FLINT/Arb (net) | ÷ FLINT/Arb | Radius | |---|---:|---:|---:|---:|---:| | add | 53 | 59.5 ns ±0.8% | 46.4 ns † | 1.28 | 1 | | subtract | 53 | 59.2 ns ±0.5% | 47.8 ns † | 1.24 | 1 | | multiply | 53 | 86.7 ns ±1.1% | 48.9 ns † | 1.77 | 0.62 | | divide | 53 | 148 ns ±1.3% | 91.5 ns | 1.62 | 0.6 | | sqrt | 53 | 155 ns ±0.5% | 93.7 ns | 1.65 | 0.53 | | add | 256 | 118 ns ±0.2% | 76.4 ns | 1.54 | 0.56 | | subtract | 256 | 125 ns ±0.6% | 79.4 ns | 1.58 | 0.56 | | multiply | 256 | 187 ns ±0.8% | 78.0 ns | 2.40 | 0.59 | | divide | 256 | 350 ns ±0.8% | 143 ns | 2.46 | 0.6 | | sqrt | 256 | 394 ns ±0.6% | 183 ns | 2.15 | 0.53 | | add | 1024 | 136 ns ±1.5% | 85.3 ns | 1.60 | 0.56 | | subtract | 1024 | 142 ns ±1.5% | 89.1 ns | 1.60 | 0.56 | | multiply | 1024 | 350 ns ±1.0% | 217 ns | 1.61 | 0.58 | | divide | 1024 | 754 ns ±0.0% | 305 ns | 2.47 | 0.62 | | sqrt | 1024 | 997 ns ±0.7% | 463 ns | 2.15 | 0.52 | | add | 4096 | 280 ns ±2.8% | 133 ns | 2.11 | 0.54 | | subtract | 4096 | 219 ns ±0.3% | 128 ns | 1.71 | 0.57 | | multiply | 4096 | 1.87 µs ±0.3% | 1.38 µs | 1.35 | 0.63 | | divide | 4096 | 5.07 µs ±0.1% | 1.81 µs | 2.80 | 0.63 | | sqrt | 4096 | 3.54 µs ±0.4% | 1.55 µs | 2.29 | 0.53 | The Radius column divides APN Mojo's radius by Arb's. For ComplexBall, it gives the geometric mean of the two component ratios. ## Ball functions | Operation | Bits | apn_mojo | FLINT/Arb (net) | ÷ FLINT/Arb | Radius | |---|---:|---:|---:|---:|---:| | exp | 53 | 416 ns ±1.0% | 208 ns | 2.00 | 0.69 | | expm1 | 53 | 375 ns ±0.6% | 243 ns | 1.54 | 0.6 | | log | 53 | 353 ns ±0.9% | 189 ns | 1.87 | 0.52 | | log1p | 53 | 1.07 µs ±1.3% | 252 ns | 4.26 | 0.55 | | sin | 53 | 479 ns ±0.5% | 224 ns | 2.14 | 0.64 | | cos | 53 | 431 ns ±0.6% | 193 ns | 2.23 | 0.55 | | tan | 53 | 867 ns ±1.4% | 325 ns | 2.67 | 0.56 | | atan | 53 | 456 ns ±1.0% | 228 ns | 2.00 | 0.51 | | asin | 53 | 2.29 µs ±0.7% | 498 ns | 4.59 | 0.35 | | acos | 53 | 2.26 µs ±0.6% | 526 ns | 4.30 | 0.18 | | sinh | 53 | 1.43 µs ±1.9% | 402 ns | 3.54 | 0.63 | | cosh | 53 | 1.31 µs ±4.2% | 366 ns | 3.58 | 0.47 | | tanh | 53 | 1.40 µs ±0.5% | 445 ns | 3.14 | 0.5 | | asinh | 53 | 1.59 µs ±0.5% | 418 ns | 3.81 | 0.51 | | acosh | 53 | 1.74 µs ±1.7% | 358 ns | 4.86 | 0.54 | | atanh | 53 | 1.50 µs ±1.6% | 368 ns | 4.07 | 0.42 | | gamma | 53 | 849 ns ±1.2% | 652 ns | 1.30 | 0.75 | | gammaln | 53 | 8.91 µs ±0.6% | 1.07 µs | 8.32 | 0.54 | | digamma | 53 | 1.16 µs ±0.9% | 1.76 µs | 0.66 | 0.52 | | erf | 53 | 36.5 µs ±0.3% | 2.07 µs | 17.66 | 0.22 | | erfc | 53 | 70.4 µs ±0.8% | 3.25 µs | 21.67 | 0.81 | | expi | 53 | 34.4 µs ±1.3% | 7.86 µs | 4.38 | 0.16 | | lambertw | 53 | 35.3 µs ±1.2% | 1.05 µs | 33.52 | 0.31 | | exp | 256 | 876 ns ±0.9% | 449 ns | 1.95 | 0.68 | | expm1 | 256 | 1.01 µs ±0.5% | 592 ns | 1.71 | 0.75 | | log | 256 | 822 ns ±0.6% | 466 ns | 1.76 | 0.52 | | log1p | 256 | 1.47 µs ±1.1% | 539 ns | 2.74 | 0.52 | | sin | 256 | 1.14 µs ±0.4% | 610 ns | 1.87 | 0.83 | | cos | 256 | 1.13 µs ±0.4% | 605 ns | 1.87 | 0.66 | | tan | 256 | 1.83 µs ±0.7% | 731 ns | 2.50 | 0.57 | | atan | 256 | 827 ns ±0.6% | 475 ns | 1.74 | 0.55 | | asin | 256 | 3.01 µs ±0.7% | 1.05 µs | 2.87 | 0.17 | | acos | 256 | 3.52 µs ±2.0% | 1.12 µs | 3.13 | 0.25 | | sinh | 256 | 2.37 µs ±0.6% | 821 ns | 2.89 | 0.51 | | cosh | 256 | 1.99 µs ±0.6% | 694 ns | 2.87 | 0.68 | | tanh | 256 | 2.36 µs ±0.2% | 861 ns | 2.74 | 0.49 | | asinh | 256 | 2.84 µs ±0.1% | 922 ns | 3.08 | 0.51 | | acosh | 256 | 2.74 µs ±0.4% | 869 ns | 3.16 | 0.54 | | atanh | 256 | 2.79 µs ±1.5% | 717 ns | 3.89 | 0.47 | | gamma | 256 | 5.79 µs ±1.3% | 3.24 µs | 1.79 | 0.82 | | gammaln | 256 | 57.2 µs ±21.2% | 5.60 µs | 10.20 | 0.55 | | digamma | 256 | 10.0 µs ±15.9% | 20.0 µs | 0.50 | 0.21 | | erf | 256 | 211 µs ±27.4% | 14.4 µs | 14.68 | 0.24 | | erfc | 256 | 161 µs ±0.8% | 9.33 µs | 17.25 | 0.76 | | expi | 256 | 177 µs ±0.1% | 45.8 µs | 3.86 | 0.45 | | lambertw | 256 | 54.1 µs ±1.2% | 3.49 µs | 15.50 | 0.58 | | exp | 1024 | 5.99 µs ±0.3% | 3.76 µs | 1.59 | 0.8 | | expm1 | 1024 | 5.92 µs ±2.0% | 3.82 µs | 1.55 | 0.57 | | log | 1024 | 5.26 µs ±1.0% | 3.36 µs | 1.57 | 0.51 | | log1p | 1024 | 5.77 µs ±1.7% | 3.41 µs | 1.69 | 0.52 | | sin | 1024 | 7.27 µs ±0.5% | 4.36 µs | 1.67 | 0.63 | | cos | 1024 | 7.23 µs ±0.1% | 4.38 µs | 1.65 | 0.55 | | tan | 1024 | 8.34 µs ±0.2% | 5.01 µs | 1.66 | 0.58 | | atan | 1024 | 6.05 µs ±0.1% | 3.74 µs | 1.62 | 0.51 | | asin | 1024 | 9.90 µs ±5.4% | 5.23 µs | 1.89 | 0.22 | | acos | 1024 | 10.3 µs ±0.6% | 4.93 µs | 2.09 | 0.17 | | sinh | 1024 | 7.93 µs ±0.7% | 4.31 µs | 1.84 | 0.53 | | cosh | 1024 | 7.66 µs ±0.5% | 4.28 µs | 1.79 | 0.63 | | tanh | 1024 | 8.40 µs ±0.1% | 4.30 µs | 1.95 | 0.51 | | asinh | 1024 | 7.29 µs ±0.2% | 3.76 µs | 1.94 | 0.51 | | acosh | 1024 | 8.17 µs ±0.7% | 4.24 µs | 1.93 | 0.57 | | atanh | 1024 | 7.15 µs ±2.0% | 3.24 µs | 2.21 | 0.44 | | gamma | 1024 | 43.6 µs ±0.6% | 24.8 µs | 1.76 | 0.68 | | gammaln | 1024 | 29.0 µs ±0.7% | 16.7 µs | 1.74 | 0.53 | | digamma | 1024 | 128 µs ±0.6% | 75.2 µs | 1.70 | 0.068 | | erf | 1024 | 436 µs ±0.1% | 25.7 µs | 16.98 | 0.21 | | erfc | 1024 | 387 µs ±0.0% | 23.1 µs | 16.79 | 0.33 | | expi | 1024 | 571 µs ±0.0% | 118 µs | 4.85 | 0.49 | | lambertw | 1024 | 152 µs ±0.9% | 9.15 µs | 16.62 | 0.69 | | exp | 4096 | 85.0 µs ±0.3% | 28.5 µs | 2.98 | 0.73 | | expm1 | 4096 | 78.2 µs ±0.4% | 28.6 µs | 2.74 | 0.57 | | log | 4096 | 88.1 µs ±0.7% | 37.1 µs | 2.37 | 0.51 | | log1p | 4096 | 91.4 µs ±0.6% | 35.9 µs | 2.54 | 0.53 | | sin | 4096 | 102 µs ±1.5% | 37.5 µs | 2.73 | 0.6 | | cos | 4096 | 101 µs ±0.0% | 42.0 µs | 2.39 | 0.65 | | tan | 4096 | 91.6 µs ±0.3% | 40.9 µs | 2.24 | 0.54 | | atan | 4096 | 95.8 µs ±0.0% | 50.1 µs | 1.91 | 0.54 | | asin | 4096 | 106 µs ±1.0% | 59.2 µs | 1.79 | 0.17 | | acos | 4096 | 112 µs ±2.0% | 57.8 µs | 1.94 | 0.22 | | sinh | 4096 | 85.5 µs ±0.9% | 30.3 µs | 2.82 | 0.59 | | cosh | 4096 | 88.2 µs ±1.0% | 30.1 µs | 2.93 | 0.66 | | tanh | 4096 | 87.1 µs ±0.1% | 31.7 µs | 2.75 | 0.5 | | asinh | 4096 | 99.6 µs ±0.5% | 41.0 µs | 2.43 | 0.51 | | acosh | 4096 | 81.1 µs ±1.8% | 41.7 µs | 1.95 | 0.54 | | atanh | 4096 | 95.4 µs ±1.4% | 39.6 µs | 2.41 | 0.52 | The Radius column divides APN Mojo's radius by Arb's. For ComplexBall, it gives the geometric mean of the two component ratios. ## ComplexBall | Operation | Bits | apn_mojo | FLINT/Arb (net) | ÷ FLINT/Arb | Radius | |---|---:|---:|---:|---:|---:| | add | 53 | 145 ns ±0.6% | 77.4 ns | 1.87 | 0.56 | | multiply | 53 | 280 ns ±1.1% | 145 ns | 1.93 | 0.63 | | divide | 53 | 837 ns ±0.9% | 421 ns | 1.99 | 0.23 | | exp | 53 | 1.77 µs ±0.4% | 466 ns | 3.81 | 0.22 | | log | 53 | 1.71 µs ±2.9% | 585 ns | 2.92 | 0.62 | | sqrt | 53 | 741 ns ±0.7% | 427 ns | 1.74 | 0.64 | | sin | 53 | 2.99 µs ±2.2% | 813 ns | 3.68 | 0.22 | | cos | 53 | 2.86 µs ±1.7% | 737 ns | 3.88 | 0.24 | | tan | 53 | 3.78 µs ±1.3% | 1.49 µs | 2.54 | 0.28 | | atan | 53 | 4.74 µs ±3.4% | 1.48 µs | 3.21 | 0.39 | | add | 256 | 284 ns ±2.6% | 122 ns | 2.33 | 1 | | multiply | 256 | 793 ns ±0.3% | 234 ns | 3.39 | 0.61 | | divide | 256 | 2.43 µs ±1.0% | 667 ns | 3.65 | 0.34 | | exp | 256 | 3.24 µs ±0.6% | 1.18 µs | 2.74 | 0.22 | | log | 256 | 3.12 µs ±0.4% | 1.29 µs | 2.42 | 0.57 | | sqrt | 256 | 2.04 µs ±0.9% | 862 ns | 2.37 | 0.51 | | sin | 256 | 4.42 µs ±0.7% | 1.54 µs | 2.88 | 0.29 | | cos | 256 | 4.91 µs ±1.1% | 1.62 µs | 3.03 | 0.28 | | tan | 256 | 5.70 µs ±0.6% | 2.32 µs | 2.45 | 0.81 | | atan | 256 | 7.27 µs ±1.0% | 2.92 µs | 2.49 | 0.11 | | add | 1024 | 344 ns ±1.2% | 164 ns | 2.10 | 0.55 | | multiply | 1024 | 1.50 µs ±1.1% | 797 ns | 1.88 | 0.68 | | divide | 1024 | 4.25 µs ±1.0% | 1.75 µs | 2.43 | 0.87 | | exp | 1024 | 15.4 µs ±1.8% | 9.33 µs | 1.65 | 0.24 | | log | 1024 | 14.3 µs ±1.3% | 8.05 µs | 1.78 | 0.89 | | sqrt | 1024 | 3.78 µs ±0.6% | 1.68 µs | 2.25 | 0.61 | | sin | 1024 | 18.3 µs ±0.4% | 9.18 µs | 1.99 | 0.23 | | cos | 1024 | 18.9 µs ±0.7% | 9.52 µs | 1.98 | 0.29 | | tan | 1024 | 18.7 µs ±0.3% | 10.8 µs | 1.73 | 0.7 | | atan | 1024 | 19.0 µs ±2.9% | 10.7 µs | 1.78 | 0.21 | The Radius column divides APN Mojo's radius by Arb's. For ComplexBall, it gives the geometric mean of the two component ratios. ## Text conversion | Operation | Bits | apn_mojo | Rug | ÷ Rug | FLINT/Arb (net) | ÷ FLINT/Arb | |---|---:|---:|---:|---:|---:|---:| | integer_parse | 64 | 258 ns ±2.0% | 125 ns ±1.1% | 2.06 | 163 ns | 1.59 | | integer_print | 64 | 73.4 ns ±1.8% | 84.2 ns ±2.0% | 0.87 | 153 ns | 0.48 | | integer_parse | 1024 | 2.23 µs ±0.3% | 1.29 µs ±1.0% | 1.72 | 531 ns | 4.20 | | integer_print | 1024 | 2.68 µs ±0.4% | 950 ns ±1.1% | 2.82 | 952 ns | 2.81 | | integer_parse | 16384 | 79.9 µs ±1.2% | 30.3 µs ±0.7% | 2.64 | 15.6 µs | 5.12 | | integer_print | 16384 | 276 µs ±0.7% | 30.8 µs ±0.8% | 8.96 | 29.2 µs | 9.43 | | float_parse | 53 | 1.45 µs ±1.2% | 305 ns ±0.8% | 4.77 | – | – | | float_print | 53 | 2.61 µs ±1.5% | 264 ns ±0.2% | 9.88 | – | – | | float_parse | 256 | 2.92 µs ±1.1% | 719 ns ±1.9% | 4.06 | – | – | | float_print | 256 | 5.57 µs ±0.6% | 482 ns ±0.8% | 11.57 | – | – | | float_parse | 1024 | 14.8 µs ±19.3% | 2.08 µs ±1.0% | 7.12 | – | – | | float_print | 1024 | 18.6 µs ±21.0% | 2.36 µs ±24.8% | 7.91 | – | – | ## Batches of 1000 | Operation | Bits | apn_mojo | Rug | ÷ Rug | apn_mojo, 16 CPUs | |---|---:|---:|---:|---:|---:| | float_add | 53 | 130 µs ±38.2% | 83.3 µs ±26.6% | 1.56 | 52.7 µs ±2.2% | | float_add_loop | 53 | 41.6 µs ±1.9% | 42.1 µs ±0.5% | 0.99 | 83.5 µs ±9.9% | | float_multiply | 53 | 83.1 µs ±1.7% | 82.1 µs ±11.7% | 1.01 | 66.8 µs ±3.7% | | float_exp | 53 | 4.61 ms ±3.2% | 1.40 ms ±22.1% | 3.30 | 1.27 ms ±6.5% | | float_exp_loop | 53 | 1.44 ms ±0.8% | 715 µs ±1.1% | 2.02 | 3.40 ms ±6.7% | | float_sum | 53 | 92.9 µs ±0.0% | 29.2 µs ±2.1% | 3.18 | 103 µs ±4.1% | | float_dot | 53 | 147 µs ±1.0% | 152 µs ±22.0% | 0.96 | 148 µs ±0.5% | | float_add | 256 | 107 µs ±1.1% | 48.0 µs ±0.5% | 2.23 | 214 µs ±0.6% | | float_add_loop | 256 | 343 µs ±0.0% | 132 µs ±1.8% | 2.60 | 192 µs ±26.2% | | float_multiply | 256 | 175 µs ±5.2% | 69.1 µs ±2.1% | 2.53 | 87.3 µs ±28.3% | | float_exp | 256 | 2.36 ms ±1.0% | 1.84 ms ±1.1% | 1.28 | 1.85 ms ±7.1% | | float_exp_loop | 256 | 6.90 ms ±0.1% | 5.98 ms ±4.5% | 1.15 | 3.77 ms ±18.9% | | float_sum | 256 | 107 µs ±0.0% | 13.7 µs ±9.4% | 7.84 | 80.9 µs ±23.2% | | float_dot | 256 | 100 µs ±2.0% | 82.2 µs ±0.4% | 1.22 | 220 µs ±0.2% | | integer_add | 256 | 185 µs ±3.4% | 102 µs ±0.3% | 1.80 | 176 µs ±0.9% | | integer_add_loop | 256 | 173 µs ±0.1% | 102 µs ±0.2% | 1.70 | 163 µs ±3.1% | | integer_multiply | 256 | 82.9 µs ±9.3% | 46.1 µs ±0.9% | 1.80 | 115 µs ±5.0% | | integer_sum | 256 | 86.0 µs ±0.5% | 25.7 µs ±3.7% | 3.35 | 80.7 µs ±0.1% | ## Hypergeometric functions | Operation | Bits | apn_mojo | FLINT/Arb (net) | ÷ FLINT/Arb | Radius | |---|---:|---:|---:|---:|---:| | hyp1f1_short | 53 | 13.5 µs ±0.9% | 30.2 µs | 0.45 | 0.038 | | float_hyp1f1_short | 53 | 16.4 µs ±1.8% | – | – | – | | hyp1f1_series | 53 | 13.7 µs ±0.9% | 15.2 µs | 0.90 | 0.0074 | | float_hyp1f1_series | 53 | 15.7 µs ±1.2% | – | – | – | | hyp1f1_negative | 53 | 21.1 µs ±1.8% | 23.9 µs | 0.88 | 0.022 | | float_hyp1f1_negative | 53 | 20.5 µs ±0.5% | – | – | – | | hyp1f1_large | 53 | 54.3 µs ±0.4% | 15.8 µs | 3.44 | 0.12 | | float_hyp1f1_large | 53 | 64.8 µs ±0.6% | – | – | – | | gammainc_series | 53 | 32.0 µs ±0.7% | 9.78 µs | 3.27 | 0.0064 | | float_gammainc_series | 53 | 18.1 µs ±0.7% | – | – | – | | gammaincc_middle | 53 | 51.7 µs ±1.5% | 13.8 µs | 3.75 | 5.7e-06 | | float_gammaincc_middle | 53 | 31.9 µs ±0.6% | – | – | – | | gammaincc_large | 53 | 24.2 µs ±0.4% | 5.14 µs | 4.70 | 0.27 | | float_gammaincc_large | 53 | 16.7 µs ±0.7% | – | – | – | | hyp2f1_short | 53 | 13.2 µs ±1.3% | 9.61 µs | 1.38 | 0.055 | | float_hyp2f1_short | 53 | 17.3 µs ±1.6% | – | – | – | | hyp2f1_series | 53 | 12.9 µs ±0.3% | 9.14 µs | 1.41 | 0.007 | | float_hyp2f1_series | 53 | 16.3 µs ±1.2% | – | – | – | | hyp2f1_connection | 53 | 52.2 µs ±0.1% | 31.7 µs | 1.64 | 0.058 | | float_hyp2f1_connection | 53 | 70.2 µs ±0.1% | – | – | – | | hyp2f1_pfaff | 53 | 51.2 µs ±0.5% | 29.6 µs | 1.73 | 0.015 | | float_hyp2f1_pfaff | 53 | 70.7 µs ±1.2% | – | – | – | | hyp2f1_degenerate | 53 | 63.1 µs ±2.3% | 62.2 µs | 1.01 | 0.012 | | float_hyp2f1_degenerate | 53 | 99.8 µs ±1.5% | – | – | – | | betainc_short | 53 | 35.9 µs ±0.5% | 9.56 µs | 3.75 | 0.025 | | float_betainc_short | 53 | 30.5 µs ±0.5% | – | – | – | | betainc_series | 53 | 81.1 µs ±4.7% | 30.9 µs | 2.63 | 0.005 | | float_betainc_series | 53 | 42.9 µs ±16.8% | – | – | – | | hyp1f1_short | 256 | 44.6 µs ±9.5% | 62.4 µs | 0.71 | 0.1 | | float_hyp1f1_short | 256 | 48.8 µs ±18.2% | – | – | – | | hyp1f1_series | 256 | 36.9 µs ±0.9% | 54.3 µs | 0.68 | 0.0032 | | float_hyp1f1_series | 256 | 43.4 µs ±1.0% | – | – | – | | hyp1f1_negative | 256 | 51.3 µs ±0.7% | 78.9 µs | 0.65 | 0.0067 | | float_hyp1f1_negative | 256 | 58.0 µs ±0.5% | – | – | – | | hyp1f1_large | 256 | 98.9 µs ±1.7% | 78.9 µs | 1.25 | 0.3 | | float_hyp1f1_large | 256 | 111 µs ±0.6% | – | – | – | | gammainc_series | 256 | 71.4 µs ±0.9% | 44.4 µs | 1.61 | 0.0075 | | float_gammainc_series | 256 | 42.5 µs ±1.1% | – | – | – | | gammaincc_middle | 256 | 131 µs ±0.6% | 59.2 µs | 2.21 | 1.7e-08 | | float_gammaincc_middle | 256 | 77.0 µs ±1.6% | – | – | – | | gammaincc_large | 256 | 52.0 µs ±0.8% | 26.7 µs | 1.95 | 0.35 | | float_gammaincc_large | 256 | 34.8 µs ±0.9% | – | – | – | | hyp2f1_short | 256 | 48.6 µs ±1.1% | 83.0 µs | 0.59 | 0.024 | | float_hyp2f1_short | 256 | 56.8 µs ±0.8% | – | – | – | | hyp2f1_series | 256 | 41.8 µs ±1.5% | 57.2 µs | 0.73 | 0.0015 | | float_hyp2f1_series | 256 | 51.7 µs ±1.9% | – | – | – | | hyp2f1_connection | 256 | 141 µs ±1.0% | 170 µs | 0.83 | 0.0048 | | float_hyp2f1_connection | 256 | 167 µs ±1.4% | – | – | – | | hyp2f1_pfaff | 256 | 171 µs ±1.0% | 194 µs | 0.88 | 0.0033 | | float_hyp2f1_pfaff | 256 | 192 µs ±0.6% | – | – | – | | hyp2f1_degenerate | 256 | 287 µs ±0.6% | 339 µs | 0.85 | 0.0021 | | float_hyp2f1_degenerate | 256 | 347 µs ±1.0% | – | – | – | | betainc_short | 256 | 94.6 µs ±0.5% | 36.4 µs | 2.60 | 0.066 | | float_betainc_short | 256 | 63.9 µs ±2.0% | – | – | – | | betainc_series | 256 | 151 µs ±0.4% | 77.9 µs | 1.94 | 0.0013 | | float_betainc_series | 256 | 89.5 µs ±2.1% | – | – | – | | hyp1f1_short | 1024 | 109 µs ±1.0% | 108 µs | 1.01 | 6.8e+03 | | hyp1f1_series | 1024 | 243 µs ±1.5% | 271 µs | 0.90 | 53 | | hyp1f1_negative | 1024 | 452 µs ±0.3% | 485 µs | 0.93 | 1.4e+02 | | hyp1f1_large | 1024 | 571 µs ±0.5% | 651 µs | 0.88 | 1.4e+04 | | gammainc_series | 1024 | 401 µs ±0.4% | 283 µs | 1.42 | 43 | | gammaincc_middle | 1024 | 714 µs ±1.0% | 367 µs | 1.94 | 92 | | gammaincc_large | 1024 | 357 µs ±1.4% | 234 µs | 1.53 | 1.9e+02 | | hyp2f1_short | 1024 | 463 µs ±0.7% | 665 µs | 0.70 | 2.9e+04 | | hyp2f1_series | 1024 | 938 µs ±1.2% | 1.11 ms | 0.85 | 5.5e+02 | | hyp2f1_connection | 1024 | 1.40 ms ±0.6% | 1.48 ms | 0.95 | 5.1e+02 | | hyp2f1_pfaff | 1024 | 1.62 ms ±0.7% | 1.68 ms | 0.96 | 3.5e+02 | | hyp2f1_degenerate | 1024 | 1.42 ms ±0.2% | 1.88 ms | 0.75 | 0.021 | | betainc_short | 1024 | 482 µs ±0.9% | 166 µs | 2.90 | 6.4e+04 | | betainc_series | 1024 | 1.35 ms ±0.6% | 802 µs | 1.68 | 6.1e+02 | The Radius column divides APN Mojo's radius by Arb's. For ComplexBall, it gives the geometric mean of the two component ratios.