From bd14e79190e33510fc309da23bbbd530a932522e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johanna=20S=C3=B6rng=C3=A5rd?= <44257381+JSorngard@users.noreply.github.com> Date: Fri, 18 Sep 2026 12:54:16 +0200 Subject: [PATCH 1/8] Skip one redundant multiplication in the implementation of Horner's method. --- src/generic_math.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/generic_math.rs b/src/generic_math.rs index 8b1aa0be..594ace9a 100644 --- a/src/generic_math.rs +++ b/src/generic_math.rs @@ -40,9 +40,11 @@ pub(crate) fn rational_function( #[inline] fn polynomial(x: T, coefficients: [T; N]) -> T { coefficients - .into_iter() + .iter() + .copied() .rev() - .fold(T::zero(), |acc, c| acc * x + c) + .skip(1) + .fold(coefficients.last().unwrap_or(0), |acc, c| acc * x + c) } // The functions below are wrappers around the [`num-traits`] crate, From 77634259ba6878ba5bada98f5ec39bc787e495da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johanna=20S=C3=B6rng=C3=A5rd?= <44257381+JSorngard@users.noreply.github.com> Date: Fri, 18 Sep 2026 12:57:09 +0200 Subject: [PATCH 2/8] Update generic_math.rs --- src/generic_math.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generic_math.rs b/src/generic_math.rs index 594ace9a..65b210b0 100644 --- a/src/generic_math.rs +++ b/src/generic_math.rs @@ -44,7 +44,7 @@ fn polynomial(x: T, coefficients: [T; N]) -> T { .copied() .rev() .skip(1) - .fold(coefficients.last().unwrap_or(0), |acc, c| acc * x + c) + .fold(*coefficients.last().unwrap_or(&T::zero()), |acc, c| acc * x + c) } // The functions below are wrappers around the [`num-traits`] crate, From a76bee974c25e65c2f6443c324d26f2ba7a938be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johanna=20S=C3=B6rng=C3=A5rd?= <44257381+JSorngard@users.noreply.github.com> Date: Fri, 18 Sep 2026 12:59:25 +0200 Subject: [PATCH 3/8] Update generic_math.rs --- src/generic_math.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/generic_math.rs b/src/generic_math.rs index 65b210b0..66b49937 100644 --- a/src/generic_math.rs +++ b/src/generic_math.rs @@ -44,7 +44,9 @@ fn polynomial(x: T, coefficients: [T; N]) -> T { .copied() .rev() .skip(1) - .fold(*coefficients.last().unwrap_or(&T::zero()), |acc, c| acc * x + c) + .fold(*coefficients.last().unwrap_or(&T::zero()), |acc, c| { + acc * x + c + }) } // The functions below are wrappers around the [`num-traits`] crate, From 05a604b57e1772b9ccd1dd1902d19c32a76502d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johanna=20S=C3=B6rng=C3=A5rd?= <44257381+JSorngard@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:41:37 +0200 Subject: [PATCH 4/8] Update generic_math.rs --- src/generic_math.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/generic_math.rs b/src/generic_math.rs index 66b49937..b919160f 100644 --- a/src/generic_math.rs +++ b/src/generic_math.rs @@ -41,10 +41,9 @@ pub(crate) fn rational_function( fn polynomial(x: T, coefficients: [T; N]) -> T { coefficients .iter() - .copied() .rev() .skip(1) - .fold(*coefficients.last().unwrap_or(&T::zero()), |acc, c| { + .fold(coefficients.last().unwrap_or(&T::zero()), |acc, &c| { acc * x + c }) } From 06b11a433a542b0b3d4e27c873710374869233e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johanna=20S=C3=B6rng=C3=A5rd?= <44257381+JSorngard@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:43:23 +0200 Subject: [PATCH 5/8] Update generic_math.rs --- src/generic_math.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generic_math.rs b/src/generic_math.rs index b919160f..5f4cdf00 100644 --- a/src/generic_math.rs +++ b/src/generic_math.rs @@ -43,7 +43,7 @@ fn polynomial(x: T, coefficients: [T; N]) -> T { .iter() .rev() .skip(1) - .fold(coefficients.last().unwrap_or(&T::zero()), |acc, &c| { + .fold(*coefficients.last().unwrap_or(&T::zero()), |acc, &c| { acc * x + c }) } From cc759db904d30dc92b9a1a250392799c445b39ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johanna=20S=C3=B6rng=C3=A5rd?= Date: Fri, 18 Sep 2026 19:49:57 +0200 Subject: [PATCH 6/8] Update the godbolt example to use the new polynomial function --- src/generic_math.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generic_math.rs b/src/generic_math.rs index 5f4cdf00..2226792e 100644 --- a/src/generic_math.rs +++ b/src/generic_math.rs @@ -22,7 +22,7 @@ pub(crate) fn rational_function( ) -> T { // According to both `cargo-show-asm` and Compiler Explorer these two polynomials are evaluated in parallel using vector instructions. // See the Compiler Explorer link below for how the `lambert_w0` function in this crate gets compiled. - // https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DEArgoKkl9ZATwDKjdAGFUtEywYgATKUcAZPAZMADl3ACNMYhAAVi8ATlIAB1QFQjsGFzcPbySUtIEAoNCWCKjYhKtMG3ShAiZiAkz3Tx9K6oFa%2BoJCkPDImPjLOoam7Nbh7sDekv7ygEpLVBNiZHYOAHp1gGohBCXadC2IrYB2DS8AOmiAZkkADjOANhP7k%2BeuOK2mZDRifCMtkQAKQaACCmy2CAIBESChAmwA7kiLgjXFRiKwxIkEEwLmgWOtAokTAQgdcAGJ4MkAET8rFKBAA6kCvNFogAhDQs2JOFns7leO5cAC0Xm50WwwpuAriACoxayJVxzpIBeSFWzqSDwdtDIdCFs8ApTucrrcHhpnq8rdriWEtlQGFs0AxzAB9TAANzEHtUrES9Agcy2wrJ2Adj0kWyBJ35YK2Ca2BhmDTdCI01EjIBAAFlQQANLbbS4aObamNasG2kz2x1J%2BmRAhpjMALxAEckwdD13DVEj0dj2sTW3Q6eQEBb0a87K2XAuGiLzpI7BAfck2Zd5jhIGwZarJ0roO1m22LeQ0eu1K2k75s/WmG1ddHGnHZ/ba67YY7A7joOHeCoa9zzJJwtg0ecfyHYdEzXbNglBYIoITCstkwWglENQCzwvXlLy2S5okkOI3TuOJrjdOJLTdaINHIyQTnIx5IPjaCEwhRkcJpMCLlI65SC2fM3S4csWNYjFbAEH0qBMBh2gYCAkNYxMzwuBQAEcGiDUhFKU6MOR03TE2FcC4lMiizNM4jLPMqztNEwzh1FC4GKsx5HhItySK8DQ3WuNy7L/BzoPA853K4SM3W8k43ROLx3NMnzpAMhzHgua4zgo8KSI0aLSMkCiNC4AKgugk4LmVLhfMFN1HmiSqTjuaI3UkWjipKxNLjiO4fI0O4vBqhrfI0HzHka3y2va7j7juIS4iauJRqE9KSK6mKJvakKvHIk4bjdWimoa6LrmOmqiuSwyQuGvaTiO2qYseHqyJi2Lmr487hyBaJqXW3TPt/SaEznH6guiecTkqx5lRI%2B5mq4aLJEFYGHLiC4uvcu5rhmoUZuuQjqMR96lJRtyfJ2pqPn6qKSIeJHDMkZy4ny9L%2BtI4iuBOyGfEJ1i53C/q4gy25opuxLYnG7ngvKrgZqI/LHlZPact85a2Vp3TLro65%2Btq/q6vIrwWsirxdbVxNPu%2B8690C5CD1Q9DMEwoDOLwyRrguSHyLiA3mvlmrHmI9LmOt6D2Odq9Lh26QBMikTg%2BHcT0ikmS5IU%2BzdJU9TNIWCW/olxyTIswbCpm4aDtIoTTdY4znI0fKuGiaK6vm2uSL8yvoMuLgtqN9zev17rIrFu52%2BHS5MeI55e4y%2BJyIbrm06C8Cbui2ryK4aW9poyK4kq4e88TELy9G9z/Zm0zGMkfKdpHg/51oob3INmaG6a9K5aSheHMunqFeVdy3kSicNmWsSKxHbubcB%2BlP6GSBvvBMbt9o1XODVPq2Vn6SDOtA3SbspB0V2oVcm1Vnh7ywUpOczNfL1xqtEE%2B0RiIGyvjfBM4FWQy0kPFF4QkG7NQRhXOB3FCrETZJVPmg9d4fD2pIaITCBFXVeDFOhyt%2BqX1foVSKjwZFjyynVCGdw65K2uFQ6ImBhQaJzl9WmVsPq2zQhhACTsQJcToXcC4UjZ4nXBjNBqLMg66VDo4l2PEvBFWjtcWOukE6SVoG6aSskJLyQlhnDSBAtLmP%2BgDauXUJ6cO8uRChDFpH8PAnQpqDx0ZUUtJ7V2JEZFzgRrrXqQ1xHk0ZuLUhrFwKXyxtVUiuj9aYz4e0yWtd8o0XyozPJIDriUT2m9IZw5LqVViLvIBzUMbUQwRRbhJC46Lzvj1LKOVKaPFnjQ6iyDjYyLdhQ46R1kG0RGnVExOySoQLSfwucGhanuzmhRQ2W1iLsO1hIk4MjwLdQnmNBidc2SKwSEU8qhtzg%2BVuFZVacMfJbTBXfAO3Dpa5SIr5VZhUzHzNvsNTFIC6r5QePNE6pFhbz12Q5Oc3Ve5w2uuTLe8Q4gmNJcywyBEdp7U8gxbaai6H9WuCY%2BFQy3nQKsWbGx9tHbYQCVeEuRFXE7womNHKB1IbUV8Upfx1xcJXjKrXEJglVRVmgZE5g0TYkp0ScgVSyTUlyqgQK3S1cbprwijvKyL1LRSu%2BezYBeSt4I2ySi7FrsRGGrhrrMWGKYofx9UpEKuNnrkRyjjCRtFG4aEKWS5h%2ByKIRQwe5FqpSS3URmbKzNrEXECylWNKRxE7jPGog8Plmiri%2B1xiiqQsN6ovWMcKF5AM6m3GppVdKBKIYnKEiY9ekCLZevSZNT52KXjuTniRThNDyaX0itiruj8BbPRRXOj4s9sXDQ4TCyq8R5pnMMdOya38hKG14r5L2PDTmnO%2BecA61TBQFqavEJm/b%2BGXHiJixa4NiKFUql7aVwom0Ay2CjLwqyEZrzUVrGtk72YbssYpFCtiHb2LVWari68REG1RnjLur6OV9WNaxU15rcNpW6vxQS0RwlKQdUnOJ6RU7NqAu6rOkDt0bXKt5a6lUSUxSMX5am2KMazzis1RpPKhLVTmTJhZYMfJSH6jdeaWVGY4wzThxZay5Y5qAegxuXdmqPquoVQBXjuF%2BTClDeupazMdSuODXt9DVpnGisqbazzvlkRlsEnh0UFojXos1NdmDwsJkuHoq%2BLdKKe3Zn8rga6wuvIse8sts55zYtZJ7HtmMZZnI%2BK%2B0FCLCos2mZFAZlEjrXBHV%2BpTFLIrIJ2ttD9v8NBWTGyVXmMM31IKOmenekg4P1a0VjZalofI0PhvprbWHvkI3i2Zat1EclnNO13b50Q7gy3Wf7fKALmqrMeGu/lNXN0CsVTbK8NHVXAQY3hOcT3oq135kKSbM1jbEROJgJiMZFPDl44x1l82hM1VE2JJg8SJMuqGUk%2BTdX8sNdiv1deiVqnn2eiI7F0y2a/MZizCKeiWY%2BYy896ieNCr5UtM/VqPXfO8Oe0j3hzXB4ZaxfwsqQo5aoOxpvWHyOp0yPpl1dDK6ymvSauwu4uWZEozeE1XqZ8osIwPZh%2BuVya7QbMrFGayahIvW%2B8KD4FGKc4d3T1zhw14YDPXiXFTqsxdqZOsOrhI1/bPTrlr1xWnep1tni9HalXTEyNSt47er7DE1WWsqU72GAZu1GprJqzxSYrsZryr3TKcOpT7qdd9vd9MPXu79mdPFR1owoidZxxnrMmO8j7hVVHlV2KwmDvjY9Nn0R8noyzDwNnfZONxkO2wOLqtnPTEbw9o4nHx9BcTTrk7xOkyVMnKTs5bv4W7Ha/NC8tSldUqRTML14x3nRfTpWbsS5ut6sf0doT5X8qIdpUMlYy8d15x8MhIHoKJu46F4pr1jds9%2BF6YGpX5vY3hG4non010vkFceIQFuohcbo9oEDCINcpAHcJkho8lhUMY2Za411Fsgo3Y%2Bp%2B5H5w9PJzgZpPd5cvV/sat0cgpYEQD4DLMvMupX4BlGp8pL5HMAYf0cor4vNBQwo8YMZLNVDJoXF7gepFFuoUV49MZMNOCHI3YMEEdeEME81lp/ZKp7s8scN6ZnsT4FZf9K1UNfkyNqsAZO5jZlZbptZ1l2FZ411YD2o5w3J3tVojtjNe4ntfIx8DDDJ5UAcp9gcVU6M58uI3Y2QV5stXZl8rpTIa1MA7gt8Mcd8w5ZxUpu1pFo47hT945CdE4L9JMBBr8gpb9PUZNc56sW8JFap3t60aFHke9v15xdoiIT4Xo9F6p0DZjxtfMIpbhl9CV8NX5tEB0Ph4p5s9ooZhohEFoYokt4MrhAN3MVpxU8kqI7cm9e8coMsJEhQwoB565R8vd1ils0oi4HCTiKoYpy4G9gkHd0p0Zr1DELdbtJ18MJ9hjvU/cLgfNoMB4FocYMpCMwjvN%2BFQZlR%2BoS1LM0sUstlPcATJCrg1EMZX14gjZod1ks9YjATkiRY/YL4F0N4MDyMiSGZ6EW4u5yJekhJnsOCc8rhytDFocqDaJSSGox9TN0StZDtGlCpPY0ttiaox9rDoJsjdJAcBw8iZ8HFwcrxQY2RLMot5YJ4so/JpVPg0dzpMcIcUYjdcc4gOjExz8YlL8pNXU5M78FN%2BEjDqpQpQFHordH0OVQsFF0FH5VlwZVSAZQZW83JSTPIuoX8vBttKcD8c0iJzC2Z1lWEcsvcSD6s5xBR9F6pR0aFRk0i7dMjATbh0MoZJ4KJj0%2BdPdvcsC0oQt489EmpCJ6Etox8gjJpLhIxKZqlbhKZGkhQG9DEUTxCPkMTI9fJuFvIRphVO1qIRtBlKdrldpYgmYYYrMap8zhRgDKcCIVN/Z4pvY5yUjKz11%2BFc9yt5ZtYECRtUi7caSUo0oQF6k/YS4O1FphD3De8hQWYsoXgepiMqDhDgLDIUYgtJs8160hRGIMDjp1ylITTqN8jZ9GiXFu14Y8T1kFoDplTlQ6jEx3Tw5O4Hto5lRfSEx/TnUr9gzM5QzfcZ0TJC9KkBtAFlEupMSjZlFu5P9qDmyH1H8hTTpDsotpY1N2YTF7ycMXEHkbtcU8lNlaJ%2BzXjJpQZfCBZn5fYzhUN%2BydLe8bgEd7kc05onjMNLlNzjYsZWkME/z0Z159Tvlu0D1GkvZocBCvNMNcYiKHIRjKcpDKcf1bh%2B5ocFYdEezSlDj%2BsbguVd5dpntYNNdByS1lEOVi5uSuEA4100yZznIN5ryE0jz08s9pZpS3EVohC9cc1xyMik9IxAVDV0pn4%2BdSIhCTERtpSRlJtlEtNYorJpkJqHK4ratJ97JSLzT6M%2BM6lssboyyD0EDEN0iu4mK2IGi98WMgFrUhJhI7UBUeLAy%2Bj%2BKPV79USJCWVijkFGDepl8noHhYK5jhollqoojqERo515YT4B1wZq9LiCkvJH451J0DTdI6l15ZlAV60u53sspbyBSdtB01LNZmN0MGIYjvk3yu4A4XpL5dZ6UpyHctpJLlD49cFe1TstZvlvJDdPI4o65f5Bpor2SlIjSgp4r0SfMeooUJUvMHhUNy52FvljpmNlDqkX51F6EZVpT8MfLlEz1aJn5cYqtQMYZhqSIqFjZoMVNTtx8vzypWlUVzJvDxlwox9lq4ipZLMzkGpe4515td4Jrar2pijy4GJXdZbjzSJqjhQMFYroISLp9aNyKLrXF0apBSkV1WQRFGpMB2ZTqixzrLT8IyoaIvkOKxQ7qIkuiokAzeiElSc3UBKhiNyazUou4gCwoe1XZUNwpJbXpGJ75Gp6oIoa81pNzu0J5DZMZ4tUF5tbzhaHIx5WbVkG4T4ZkpAvFjbNyyTKEyztZLj4TKyoTNzIwwo7jAskDuyPKUalIypfC%2BoV5GkhZmpYgJr0LdIyppZRly5aImYMpwoNdL447fo0Te8%2B7zgRE8ZFR1EiN%2BY2ygoXFlQRp0bCJ3splBQTd%2BFPSjFVoHpKY7MG84YHcHhdYvMgFMUmSbgVSZFQYTkWbyYUHuES0NdJqbj7he5fllRUs1NaIlrktBo9DPttpeEbpN6Y7pysjVqcj1rE7QdGj6Zeokd75Ix3skDeplDc6oxXToEWKtgRsLgtoNEOKwlK6xNq7HVa6ScZNBjXqW6EqXEgF3IRsREpi512G%2B714u1fLo9Lj2E5YF6YEDH2ECTn8PIV5u10iqziGKSpEUE60o86D3aSp6ZlQxyLDCCFZvIMCDZHtFFYg15Ymu9oZo61zx6qFwYjpYURthZTIJqAnsFUYB4gEkc3hXpgVAGb7kIpG7GJbBTwo2C15VoMZ5ovYCyPCyCU0Z6pVC90pWqzKPb0pSZRrOEXCapAN%2BTOnoJyEDyzlU9FY9bsmJHkmeI4dpYEdr0aFvjA6aGDG6oPI64VdyrgkTFY7t6JFgl0NFFDE6JhVPciJgHEwE6zSk6LS%2BNLVYU6F9CV5BpTJkd6587dGtZUYFpccpAuKtgHq67%2BiHIbGwydtIcrons%2Bs49ht4Gv4K1FSeF0MINlp4b8MkmEGwYa0D7NlK8FEyN5mSoLKYYit%2BdkHKZSJybNybga0uyN5Yollu0x936yFXF74tY14mSzhKUxHbgGCfC198MC81LAGg6SoSxfZKIhCBlLbc09SpROWRbumxbQG4Cua7mbhh73sFyc7MCCaGTZlXC0t7h6ocoarkteEsLIwIYorIwx9qzCz6qOcIY5Fym/IgqSqFy50XIJTPZfK37QMHXR0pAmZWS%2BSXmyW6ZUZC8Bq9onpCJGJANPdCIAWEwgW7ZNrCiIcDGtMSZ2WYpr1ngWZc7N9tGBVEXQY9rUWRNTGCciceirGb9G6Xq8WHz6YtpSkvMbgyqOEZWW13Ysp65DszIG5wmxn0zyp5Xql65vj0Z8N/XwzUYIoPssKntxkw3RQAb2prSFZXZRXXcTiXhbzBgvKW4aJop8NlF60DtzX0oZE9LlojMKnqEIjTt6JQMStR1eoON35qqpQ129IxCbX3rAmHdho5ZWmv7Ptxl7htKKbjyd5EoEC9nCJo76CbjRp3sECEtqCvGPLLWWVB1dcAPM7YnntXcJqI2cM3ZgkA0z575aIkdcG6mB1hp%2BkJ5vYbha8ZYXnNnR5bnSSECpEeaV5joTEnta2th62QcCjGjO4LJlpzQO215c7ai%2B2/FC6%2BNMYrg%2BpUXHh0XMXJ2Bjp3ycH8dtUpTJXc51n6up4ZC3dIEM7nTWbp/5dyQb93JocFU1u59VdU17/411wvZXDFXD74G5Sa7L2PksqFiEDM8lLjDHqIJqn2SoUYo6YoroRtX4z1SOY6avaSmzJF20u0z09E6J9OhOAZ6Z5YQ2A4W5LQa0%2B1TF2vWJRaVqcPUatz6tP7dye0TlocZkdoMC1PEw8Mt4d6Ho2YUGdofsHd5ZPY4c5oEdBodpG4%2BrBSKqbpX1CVMYeoEZrm2Gzknsz7uld4/WY6OPDIK81a7o%2BuAM2Y3J9PAfdIzcINCVLQhdNNTsTlDPjOyLQWiir3Db6FPi3G1FvsPgEXHOuIME5Wo5BI4YPPzHic%2BKG6Qzm7sP4Mzc9F18Gu%2BtSabmgF4tWnu7Ip4y9O7zksqJQvIpVk4pLM5ot6ayeJPILQ9o189n9cPKsvWJUoEYTC1Nflbky2OaVfSoeIlYsyfYLc4cGUC2B1KJ%2BY9d49/Zq9C8Nca2bjBcJToc%2BOzlIYMDapDOPpbWPaKbANL4nGN5a4OFDtrj6tiTBYnomqu5DdCI10GWHJsC19659YXoT3FYNc4pHtPJL5Dtyy8Ym4JqjnaShReTtpVotogv9YXmS%2BQLbhDcqFBC/khF3v0Ok8g9t4a1kELyeE%2BVE/DTrXWI0fG3Gi0brMlZqV8Z4Y7p8yS8iethd8i6toD8DOtg5AJSqfx3LHafrG3VaB5JbHGfpCXg6451TI5Y1E4pcp40kOwKtNpYTC2Y9fzNxfjNq9WWe1oVEDH1vXo0mG2cSBGDH3TqheJu4N0bWNlhLRswk8uMGfrinRiF5AuCXD2pVwApIJSkgGNNBrh24JgUYgiWGFfFaYnIfIVRNdNDzNhD9JGC3WVszjnQPBw6%2B5AjpZl/4zZEBTMVpA3BGjIkxch2aXB%2BmPKKNroR0JPK7FyirRS4suStLeQw7Dhay1SWqOgiRyy8s8uA/jOcF1ioJvu90NeFK0bwyIY6BjetA1EYjUcoYbaIVqIUowyNgWC/BMBvw%2BBb9uiO/IMnTwP4M95u/CauJDFPT81Xch1TttimeBSciMC6LTCNgDiPoj4Y0XGOKm/qlIKBHSO%2BEsirStIN6AGM%2BJjBkRlRv%2BCUF3ubV07Ukua5ccKFfDxhuQrIatcPpTktQ/0qUQzOEnDlMqm4eImyAWKhhOgXYeyeNDDnN2oGblH0cJK6HFG2hQwWorhF/uSnx5Qw/IAHThLy28iyDEwiuPApwiQZDRhYKAwEjBmQJhRI616dmHLGqE4ZLUuDHVOxkHzvYMY5AloVzhvIi4mOE/bvAYMhyXFnesUaDJfXrTCE9efQ4cEC3LAHhY4LIMJByECC0ApgEAMQAiCYAABPBQGWC%2BiPgnQnneJCBE3AEAtgwQdsGYDwAthMA/EDEVsGpA4jUg%2BIsMBAHUAdh%2BIDAdwJEEJwkA3QaATAFQBoDIA8AjAAgHCD0jsg1wZIGcIhAsQjhGAqAFgIEAZHEAmRqAFkWyI5GCBuRf0PkdcBnBagvon4HsN%2BHs6Jh6AmI2kWwHEgkALwV4ZILQFhEMBRReAMQJSJpF0iDRko5kayLwDsjORCI/kafh1HCjzRYo5gEQGIBGitgJos0RaKtGqB%2BIWAL0eKN9FSiZRTouUVyLLDKjT8eo%2Bkb6MXDhiLRPokgICMPDlgtof0cEVMHNjIiAxrgIMWKLEDoiBA5gLEaSLxEPgewlI98JGEJHSjHRzo%2BUe2EVGRh%2BRWI82OqN7D9gtRCYB0bKJdHnQLggQIgG6EICRAgw444gF6DnHQILg/AA4BABCj8QYwTgb4MgEJFbivgPwLYLKC2CqApwM4ZAFbArAcAFgtATgNEF4CeAOAWgUgKgE4AAAlMwJiIUBLAVgDsEETwFIAEBNA14hYAAGsBg9VQqpGBLRaxpAt4jgJIAfHASXxnAXgHCC%2BRASnx140gHAFgBIB8QiQOgJEHICUACJREqIMQA%2BAtQ%2BAdAAgJEDhAQAwgyEsIOKOICwjOAAElicwDYkAB5MINoCqCYSAJ%2BINgIIB4kMBTRyErAGEBMDABtxtAdCBxN4BYAWAhgYAOICwmkB8AC46oJ6EwBwhNJmAVQFUBJBrAAJk4tCMhIhFhAMQbElwFgGQkEBiAeAFgEpNIB6TiAYQFIJgGpCYBVJRgCEUYGAkLAqABgYAAoAABqHIhEDxMSCMA3J/AQQCIDEDsB6CiU%2BQEoDUDITdARUAwEFNMDmB9AeAMIHCEgALBUAiQeJAZOFA8TeAqADyc5KwClSoAzANgCAEwD4B4k7ksQCYDWDeQDYIEywGhEEnpAHADAZwK4GaB6B/AUwYoKUD0DJBUg8SUYJ4CKiLT8gDAHoHNP6BFQ2g8SToCMEmnZBdpw0uSAdMmBFA%2BgUQXaRMBWl6BzAXQLaVdIkALBvxywVYC9P0B3ikJmk18RwAxafjzwc4RmBBAgC4BCAho/8XMF4CYStAcwBYAgEwBMAsAUQLSOBPogGMy%2BuVRmJPC%2BkISfpz4v6WhJAAYTgpN4zgF4AJl1TUJgEsme5PomjTJAQAA%3D%3D + // https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DEArgoKkl9ZATwDKjdAGFUtEywYgATKUcAZPAZMADl3ACNMYhAAVgBmHwAHVAVCOwYXNw9vUiSU2wEAoNCWCKi4nytMGzShAiZiAgz3TwrMa3yGWvqCQpDwyJj4yzqGpqyKkZ7AvpKB8oBKS1QTYmR2DgB6DYBqIQRl2nRtiO2Adg0vADo4yQAOc4A2U7vTp64ATm2mZDRifCNtkQAKQaACCW22CAIBASChAWwA7kjLgjXFRiKwxAkEExLmgWBtAgkTAQgbEAGJ4MkAET8rFKBAA6kCvNFogAhDQs6JeJws9ncry3LgAWi83Oi2BFcUF7wAVOLWZKuBdJILyYq2dSQeCdoYjoRtngFGcLtdYi8NE8XtadcSwtsqAxtmgGOYAPqYABuYk9qlYCXoEHm2xFZOwjoekm2QNOArB20T2wMswa7oRGmoUZAIAAsqCABrbHZXDTzHWx7Vgu0mB1O5P0yIEdOZgBeIEjkhDYdiEaoUZjcZ1Se26AzyAgrZjXnZ2y4lw0xZdJHYIH7khzrvMcJA2HL1dOVdBOq2O1byBjsWp2yn/LnG0wOvrY40E/PHfX3fDncH8dBI7wKgbwvMknG2DQF1/YcRyTdcc2CUFgmgxNK22NolCNIDz0vPkr22K5okkd53Vud5Yndd4rXdaINHIyRTnIh4oITGDEwhRkcJpcDLlI2JSG2At3S4CsWNYjEOl9KgTAYaoBAgZDWKTc9LgUABHBpg1IBTFJjDltJ0pMRQg94TIo0yTOIiyzMsrTRIMkcxUuBjLIeB4SNckivA0d1Ylc2z/3smCIIuNyuCjd0vNOd1Ti8NyTO86R9Psh5Llic4KLCkiNCi0jJAojQuH8wKYNOS4VS4HyhXdB5ogq05bmid1JFooriqTK53lubyNFuLxqvqnyNG8h4Gp81q2u4u5biE95GveEahLSkjOui8a2uCrxyNOOJ3Voxr6qi2IjuqwqkoM4Kht205Dpq6KHm6sjopipq%2BLOkcgWiak1p0j6/wmxN52%2BwLogXU4KoeFUSLuJquCiyQhSB%2Bz3kuTq3NuWJpuFabYkI6iEbexTkdc7ztsaj4%2Bsikj7kRgzJCc948rSvrSOIrhjohnwCdY%2Bcwr6950otKLroSnkxq5oKyq4aaiLyh5WV27KfKWtkaZ0i66PiarRdq8ivGaiKvD66JVaTD6vrO/cApQw80NoDDAOAzi8MkWJLgh8j3j1pq5eqh5iLS5irZg9inevK5tukASIpEoOR3EtJJOk2SGHkuydOUtSNMWcXfvFhzjPMgaCumob9tIoSTdYoynI0PKuGiKLarm2uSN8yuYKuLhNoNtyet1rqItF2525HK4MeIp5e/SrxHobzm08CiDrqimryK4KXdpoiL3gq4e86TYLy5Gty/emkzGMkPLtpHg%2BF1owa3L16aG8atLZcShf7Iu7r5ZVNzXgSqcVmmsGrz1jopM27dc6fwMoDfeiZXZ7WqhcaqvUsrP0kKdGBOlXZSDojtAqZMqpPD3tgxS84mY%2BXrlrE%2B0RiJ6yvjfRMEFWTS0kHFZ4QkG5NXhhXeB3ECrETZBVXmg9d4fF2pIY2/Dv5NXuNFOhSs%2BqX1fgVCKDwmH4VSplWq4Nbh10VrEah0RMAig0TnT6NNLbvRtuhTAmFHagS4nQ24lwpHkTiFtDe9VmaBx0iHJxzseJeEKlHWIMcdLxwEInGSHRU7gNYhndSBBNIWL%2Bv9aunUJ6cK8uRShDFpFkNYhBOhjV7hoyolaD2LsSKaPnPDI2PVBriLJgzMWRSJaX0xlVUiejdYYz4R0kcwVL7URbgzPJmtYiUV2q9IZt8hoVR5LvIBciPGYIotw0hCTzp326plbKFMHgeOiG5GiFMwH/W2K7ShR1DooNosNWqpjtnFUgWk/h84NB1LdrNCi%2BtNrEXYX1CGxFTiaIgl1Ceo0GJ1zZArd4EKyr6wuN5C0lkVqw28ptJFQ1/bcKljlIiPlVkFXMfM5heyIqa1qnle4c1jqkSFpc/684uq91hldMmW8Z7vFMeSnZOkCLbV2h5BiW01F0L6rEUxiKLHmxgdY02ti7b2IdthQJ14S5ETcTvCio1sr7QhtRPxikAmxFwteUqtdQmCTVNWGBUTmC0HdFJWJaR4nFSSVnKBekKWhiXgxIS4Ud6WWelaaVPy2bALyVveG2S0VIpdiI41sMjaiyxdFD%2BgrFLBRxk9ci2VsYSNoo3DQhSc3FKpfNPKmC3LNTKeW6iMy5X%2BtcfzaVo0pHEVuE8ai9x%2BWaIIj7HGaKpAwzqs9ExIpXmsrcRaKmFU0pEvBscoSpj16%2BoVZW3S6SJpfKRc8M5z17h5VOWTUZLKJoQS7o/fmT00ULo%2BB43FVF%2BZwoqjPOapyqGzuvVSqQ3leI%2BU9jwk5JyfkXH2jUoUxbGoz0ZoO/hVwZ7YoWmDYiBUKqexlSKVtO6RzIy8Ks%2BGa81HxHrdOtmW6rEKVQnYhxGqLVcXXiIvWKNcZd0/Zy3qprWLmstdsZGGNvlR2iBExSTqYnJ09YFb1KTs4dOgQR2%2BXdupg12plMGjU4hoz/etHix0eT1qabyoSVU5kqcpdlbyUg%2BrXTmplBm2Ns1XIuhVO4st81AIwY3LuTVX37MAdNbaN1QqQ3rhWq5wqlnlxniFxWKotovJ%2BWRaWISeFRXmsNeiTUN1YKs1o/RV9xn3x3tUrgG6ouBXeUpv1hWD0yMuKyD2faMbSx/R8T94KmsFWZtM6lZ9DGxDHfp4qsivL2Z2ttNy8QyYaEsmNwKPNoZfuQYdUZO9JBIf9WPDe6MopWm8qcuGsU8t4Z%2BfDKKHwgU6JyT%2B7bIou4/OiLcaW6NqptMBU1VZDwN0CreZYi2dGVX2ywiBZjeF5yvcO7wzqn7TMz2ipgJisY93Bx2BxTVc42ULf4oJB4EmxJMAki6t1MnxbydSXV9HxV5wxT6uvBKNTz5PREUi6ZrM/kM2ZuFfRzNX1Zbe9RXGBU8pWmfi1Xrl1a7M3Ls8CmO1WRZZxfw0qwpZZoKxpvPmA6Z2aLpvDiia7ykvUauw24%2BXNHI1eI1HqZ8NPwzObh%2BumjXbnHg6ZGK0001CWen9p7%2BHAfbsB7T5bC5cWcKGnDAZ68S5eRF6%2BiqtFY22a3q5MFnCCtXLpi7Xuo0uoeOettSrZjNEpR8dvT9RjqpLRVI9oP/1XYjQ1o1J4JM10Mz5U9q9bUUp9xOt%2B3uZ37qPbCj8jX%2Bq4pGcxYbZHYpvnyto3ZejqrGMQ8E2PDZ9EgP60JdRdhmBTh8Yx9sLHkPrxSFSj1fH0UicwSk2TpOcTKfIBUsk6nO7lNXPd6LMiHmUELR8FGYkV648pysmoztKIi8S4et/VZEZta8AD/5FFo8KJINiNg1vIcNm04p71Lcy9%2BE6Z6pX4vZXhG5HohoA8VRNF1cQEW5spDtMDCJTgN1XMm8UYakRs8kRV0ZWZa4N0lt7JXZep%2B5H4E9Tlh9poA9Vc6sQ8at6srk4F4CFwE915ddX4BkGpa1L5Asror5/MhRQpcZ0ZbN2CJpXE7hupFEuo0U/YfJ0YUt%2BFXZMFpo9ZlE2ZZkV49Ux9s9/o6Y3sT55YID5pMM/kqNqsJpO4587kfIfYW9vYPEN1G9903Zwp4tqI%2B1b1N5sZTE9YaNgcV9Qc1VwdQ5rlrhuEowY8gNLoTJ61MBbgT8RwBMWMUpe1jYo5bh7844ScE4n93U5JX938fUPl/V%2B8JEao8ovIdN7oaFcUdoiIT4T0NkgEcoAd/pZErRGZ9Z9F6ERUjEzkh0yp5p8pMNIY8VcD58hCDICJQMfNloJU8kqIXde86dQYssJFhRQoB5657N/sfk0ptVlEFshI1F6pLI8i/CJoblXhlpDpqFsopi2Q8i4Cv8gcadPlLhX14MB55psZ0pSMlY4ZNEQYVQ%2Bpy1bMMs0tNkA91jUiaJd4a9DZ6FMCB9S8Ui2poc%2B1hZfYL4l19sN1LMrkQYgF6EW4u5yJekhI3tBDy9rhPCjFDtrpZlyT6o8ihS514hjsmkCoPYMsLRho8jrj3p0SdklVrZrwGN1UN9nEKjbMNM5YJ5MpfIZVPg0czoWiodkYLdb93huikxH9XVn8PUhjM4FNfUw97JLCqoQoSIt4FsHdcVOVIsFEMFH5VkwYNSJoQYB9XJySPJOo%2BZ4gdtCs6YjpzcZlfJWYPtWFzsaDMShQDE6px1Tkz1XsfI2CASNkd5hpYT31%2B1pDkiDdtFbN7D9EdNiVDZcNWQjiowKYuDeEvJMYPhTEjECiMT/VlDCt3MfJuEvJezzdFE4hbM3dUodoeRtifdeE5ZTFUTotrgE8/Y4ovY5zzN6insoS%2B8nJPC5YQVMCRte44h/j%2BEUojplE59XIS4u0FoZDPy3jhRmYtMUVyNlSZC6S2phMPJckFYykfyCCjp1yzSQdLS19rSyjXFe04YCSPt5p9o1SVQmikxPSw5O5nso4VR/TExAzycX8OkqdFM0TIzYFjIa8qlqVAFlFOpsSDZwLgDdovY2QX1nD6YnTjsNMpZk82ZbzNFXFHlqJVkcY8kNlaJqDXjgYUZPD%2BZn4fZzhMNqC7y504g3CHl81ZonjpyzL7J5xDZMY2lME/y0Z14jSJ8PIaIz5WSPI%2BsOyRQcZCLQ9MS9CgCIp5EoNqJ14KJeCjjo1qJ8165d4do3tEN9ciCFxRZMFDsN5XI15FEXcsy2pw4N47MXolkjMwZZSQK3ECqVoqrW4Jzu98iSqowgVjVASBzlpByYrF8xiFxL0UE89ookcyJu80o4rFJzTBwSKwdHEL85w3FctrpqyzlMDUMOyu5GK2JMcyj2MgFbUhJhIHUdluLgzBi%2BK38wzP94rNzXZzl/lC0B5gN7g4LF474lkqp2FGJ08F05YT4jjtNPt/581epH4F1p1jTyE3F0raIgUm0u4pjMovBBSjjTk1KNY2NsMGIhzMTXyu5/ZnpL4jZGU8jIi2pXZNpJLa17C8F%2B1HshgGym12FH5wou4yYBpcNplVr7Jv8509Cep9pJV/N7hMNy52EASa9cawN9L4N7CCaLsOriNfLlFRlaJn4cYqtINoZRrhR4N5ZDYEo8iprCsUoPhtiMUgjwCwoUSo0Isf16pe4F0Ftd5Vy6ripvr5dY8FaRtlp3zMEJaYJ1rV8tqmNN8MaREpF3JdZappSTE2ZzrixLrsdiNrghpb8u5OLtgnqBiU5QyP8BLPqGsnaYzYSwoY8zj0LxsqUXZGJ74Go6pwp29VpMTe0J59YMZrs0EFsdaOTiox5ObVkG4T4ZkpAQszbMSKSqFqyQUTijFzdISfkoxQo7juFfJezZtgq1cLLJTMD7oXM4YeRVy27ApSopYz1y5aJGZ0pm7TFdCl9RiGssTpcf4RFcYlR1EyM%2BZzC2pXEVRhp0rCIpipkhQrd%2BFvTjFuqUEQk8CN0HLoSeIp1/MgFsUkcgKxRg7zLjkOayZYHuFy1WDJqji7he4/kVR0tk9aJVzsHOSUYBpTCfstpeFrpl6RQpFY6Rx47ij18yi6YeowV74owpjZiepa1MApBc7mLrkWE252LwkHrIlejol%2BiKdXrhjwzf6lDXEgFZs1EVQdMF0GG9D14e0/Ljppl60%2B6p7w89ZZslptpecV5e1or6z/URCqS06RpG1k80osHhzrHMj/ZKCbaeo8iIG3i2QhFu4pA28W59F3y1zB7qEwZDp4URshYTJVz3HhCUYB5RSnp61NYIZaG7gRGIFFDpb%2BFSTOb74PhMZXLPYSyc9DN00x7pUa80pS9ntMS0oSZhdT1PtwZQMCCpYASRUpF887c5q7gmbhy3sRFhcZ5G4PIpYg6STmtM7e064tdOULhS8Y7V6JEQlsMarPD6I28v7ymYJasiKijNqSjtrBNrV4U6EzCV4BoTJWD65VH86dr4gUZ5oS77VjxHU9HnUgzK7ZN7J%2BKIzkNodLpXt%2Btho2sLQZbNZL5sMYNvH81iMOHipdLYTFifINkEjSYN1PKDIQZnMoY2yYGKZSJKbNzzR61IYIYQsMtXs0LLt754g14kdzhsUBlaHCXlLPY5p5FiNq81KGnSH7JSwfZKJpCBlDY6LGJTEeQmnWIpbUiflWQWre6piuCGo%2Bn/orh0YImPMMs7g6pspCbMSec4iT4GX/NfJHsvJhywZedwZLpMF9pfIz7/UpGuCF1nJpSPY/L77INM7aUhJRkMY14BShHknApDca8hrdpZ4ak/YQVjX82zXTSdIxHvmJHsdvLfJfYSZ4VVj%2BpmZlHj93SYE1GcYnIgES7xMdHJMkXpNeKd0MXTHHW6ZNpcKGaPCOEH6oy3ZMp65jtTIG4/GHXsyyoJWal65vi0ZiMvW20UZ0iBtfIzl9Fjcg2gb7IQYeRzdm3XDQSwV4Y8i3mdJvKW4aIopiNgS7dZiA8Vr%2BFdKlozMCmtYQV9Ev6qXw8hp3bxdhQIpx1i3cNTlTX3mWmLXlLEP%2Bpvja1OFnNtKqbI6ezIDDtRpCJ3ypBZyb3DZrt74LhHGPKXtjV5p/2109YylhdS8RtTyQk14FpoDZkwVuqymjihp%2BkJ4FLI7XhpYv60bWIUNRYLhb7zc%2B1jkMPlPdJ5DWI63bZE6bS8JO5zIloLQQtHpKspYIWz8yiMZrheoS7CcR3idScUXDHJ23qa7MXdsUoTIfcF1BZ9U4Yq2biTnP15ZroUD/2wad2WayoM1u5DUp94b586OJn0rmoi9ya7K2PvXqESEmoJWTjNozlVz72DJkZSJ/5LoRtX5RkNmhGqvv3rhwpZcHCe1Rl9E6JjWHb%2Bm5ZwYJERtxcPIXh%2BVWvTYa2FChK2vaCkuuOV4loFtW2CDdPCMTnrDhoQTWNNbgKgm3Zu4jdZo3CBpQtqIknjni42cIpiURNJEdaCLkNOrr2D7uld5PWhGWWcE3Yalz0oY8lTIwoA8TXkGnIYNiUtjNMbHHtjksPDOrTSjsdXY8Scr6FPjbG1E/sPg7Pz9BNME3Fa4S7Tgy6K6vOvUfORiNzCsZ4nIb2aPooUFnWMrjn23YZamMfrsjpSO%2BXKI4oVXVlYpbNZoV6%2BXe00Z0oeoqOylYTpzwudIUp4ZrDk8/lYiFseaFfFJ1dFY8zvY7cUOmUv6teVOUYUF5pJT7C/Y28a9aHCIpPx199a4ykf0hX%2BVmafoZvJacPOG97QNL5ZsN5a4OFjsnD/VSSBZHpk1zNDyx94P7JiD5F65dZnpD2FZaHYp2P619ZXsM6z165VyPfw9hR%2BStoVpNogvdYv6i/kpUo07I35Kz5iVCIdbMOSq0CZ4TMjYvZL5%2BV4/sP9O47iKjOfmk6WMMb7NFYM2eQ4ZboCb688erqLQzzh5tg5BpSyex2DGJ3KfLhaAU5a7Zumtng64F0TJZY1FYocok1x1aJlFm2pZrDWYTeJZheY/qoGXuSn1l3dkrmmo41qG3OWYghj0K1RhWW0f3LlnLSsxhyOMWfvijRg15AuCXN4uVwfjIIykoGTNLQw25JhkYgiGGFfFhLHJsC80ZllhxNJzd0aHOBdPcB9yCtOE/dKblWguBbQf06MRmG0gbjDRiMoAxcj%2BiOjdRX6ypTVrTHnQ5QVopcQeFlhvKEE%2BWesCGhgjBQeRhQYfQrPgLny4t%2B0/8NdFLFMqaIhGzWJtPVEYislIYHaXlmiUH6iNh%2BDGHtjsghCJh1%2BHwTfh5x4ohkjG%2B/D6kf39TVwIYF6OuFVC7j/t70P/NWG7AzLWdyMzbEbP7FxRHxRohlJni/TKQ/dc0INTIrWjaRL0QMZ8DGAt1hRmRbM8iYUMt1pKWty4YUK%2BLjAzy/VLuxVf1Nalfo0oVoTKBwuDHIHg99EeXWZHREwIWCnsYQ6btYOaZUDuY/9FQgtnuRoYvECUNRN/UmHY9IYvkf9pwmKwRQrQC3XqEQIMRopFYtDIYeMIQwUQzsbMIDPejZiyw1BVya1N1T1RcYKIC6IUC8Wtw8RryVUGiFMTnznAx8hwmCE9muAnExcC1LWjtxeZigX%2BHzWtsRQrCHgY4LIcJByECC0BpgEAMQAiCYAABPBQOWE%2BhPhnQ5PDoKBC3AEBtgwQDsGYDwCthMA/EEkdsGpAUiUg1I8MBAHUCdh%2BIDAdwJEBJwkB3QaATAFQBoDIA8AjAAgHCF3TrgyQs4JCJYlHCMBUALAQIDyOIB8jUAAooUSKMEDijfoko2ILOG1CfQvwvYH8PYJHD0BSRnItgOJBICXhrwSQWgJiIYAKi8AYgVkRyK5HWiVR/IwUXgGFGiicRUo%2B/OaLlFOjFRzAIgMQFtHbB7Rjo50a6NUD8QsAoYpURGNVHqjfRmosUeWD1H35LR3IiMUuCTHOjwxJAWEUeArCbRfoyI6YGbHxHRjXAsYxUWIGJECBzAZIxkVSMfC9hWRH4KMLSLVE%2Bi/RWojsDqKjBSiyRZsI0X2AHCmikw3ojUf6LOiXBCAkQYMEuOIDeg1xMCFSAAGs8ACQCAFwHWojhLg/AQ4BADlDziMx/ovfkwHMDBhLg0kBEBiASDugSA8kYXguEWCDgnA3wZAPxBZAPBkAsYMCLOPsh/jtgcobYKoGnCzhgJMCSsJbErAcBFgtATgNEF4CeAOAWgUgKgE4AAAlMwKSIUDLBVg9iBETwFIAEBNAKExYDuJiANVCqUYctPEGkBoSOAkgTCTRNwmcBeAcIb5NROwkoTSAcAWAEgHxAJA6AkQcgJQAklSSogxALpt8hoC0ACAkQOEBADCDcSwgSo4gJiM4CUSdJzAPSQAHkwg2gKoIJMon4g2AggEyQwAdHcSsAYQEwMAF/G0A7YBk3gFgBYCGBgA4gISaQHwAbjqgXoTAHCECmYBVAVQEkOsEomBA1J7EnCSiLCAYg9JLgLANxIIDEA8ALALyaQDCnEAwgyQTANSEwC%2BSjAKIowDRMWBUADAwABQAADURRCIEyQkEYD5T%2BAggEQGIHYB0cup8gJQGoG4m6BCoBgaqaYHMD6A8AYQOEJAEWCoAEgHQCKSKBMm8BUAhUnKVgDmlQBmAbAEAJgHwAdACpYgEwOsEmycT5giwSoMnAcAMBnArgZoHoH8DTBigpQPQLkFSACAxgngQqJ9I6C9A3pAwQqDdI6BdBRgj0rICDLaCWSagkwQGf0CiAgzJgP0vQOYG6AIzUwEga6aRLWDYz9A6EriYFLwkcBy6REi8POE6iQQIAuAQgDaIonzBeAgkrQFdNIAIBMATALAFEE0j0T6IzWEvnEDoTsJXgBMjiUTJwkky%2BJIAASTVNQmcAvA4s9abxKomyyCp6ktICAEkBAA // Note the vector instructions with names of the form "v*pd", the "pd" at the end means "packed doubles". // That they are operating on the 128-bit xmm registers means that two 64-bit floats are operated on at once, // and thus this is a way of formulating this operation that makes the compiler likely to vectorize it. From 86761088d4c6e58dd3ea22406db1b0796b6354d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johanna=20S=C3=B6rng=C3=A5rd?= Date: Fri, 18 Sep 2026 19:51:10 +0200 Subject: [PATCH 7/8] Add changes to log --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 817e983c..483e0c60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +- Speed up function evaluations slightly (5 to 10 percent) by skipping an unnecessary multiplication by 0 in the implementation of Horner's method. - Improvements to the integration tests. - Update transitive dev-dependencies. From b717760fda0e71805b1b818d65b556b8b3644003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johanna=20S=C3=B6rng=C3=A5rd?= Date: Fri, 18 Sep 2026 19:53:39 +0200 Subject: [PATCH 8/8] Bump patch version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0384a767..d34eb19e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -294,7 +294,7 @@ dependencies = [ [[package]] name = "lambert_w" -version = "2.0.4" +version = "2.0.5" dependencies = [ "approx", "criterion", diff --git a/Cargo.toml b/Cargo.toml index 51574e5a..5e772821 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lambert_w" -version = "2.0.4" +version = "2.0.5" edition = "2021" authors = ["Johanna Sörngård "] categories = ["mathematics", "no-std", "no-std::no-alloc"]