diff --git a/src/compile/mod.rs b/src/compile/mod.rs index 6fcb31970..7453efd7b 100644 --- a/src/compile/mod.rs +++ b/src/compile/mod.rs @@ -2055,6 +2055,24 @@ code: .map(|_| self.primitive(prim, span.clone())) .collect() } + Primitive::Neg => { + self.subscript_experimental(prim, &span); + if n == 0 { + self.add_error(span.clone(), "Cannot have the 0th root of unity"); + } + // Ensure that common cases are exact + let root_of_unity = match n { + 1 | -1 => crate::Complex::ONE, + 2 | -2 => -crate::Complex::ONE, + 4 => crate::Complex::I, + -4 => -crate::Complex::I, + _ => (crate::Complex::I * (std::f64::consts::TAU / n as f64)).exp(), + }; + Node::from_iter([ + Node::new_push(root_of_unity), + self.primitive(Primitive::Mul, span), + ]) + } Primitive::Sqrt => { if n == 0 { self.add_error(span.clone(), "Cannot take 0th root"); diff --git a/tests/optimized.ua b/tests/optimized.ua index 675e1277a..82bbfb90d 100644 --- a/tests/optimized.ua +++ b/tests/optimized.ua @@ -252,3 +252,10 @@ F ← ⬚10(/+◌1⊞(ׯ)) ⍤⤙≍ ⊃⧅≥⧅(∘≥) 4 ⇡3 ⍤⤙≍ ⊃⧅≠⧅(∘≠) ¯1 ⇡4 ⍤⤙≍ ⊃⧅<⧅(∘<) ¯1 ⇡4 + +# Experimental! +⍤⤙≍ ℂ5 0 ¯₄ 5 +⍤⤙≍ ℂ¯π 0 °¯₄ π +⍤⤙≍ ℂ0 5 ⁅₁₀ ⍥₃¯₃ 5 +⍤⤙≍ ℂ0 5 ⁅₁₀ ⍥₃¯₋₃ 5 +⍤⤙≍ ℂ0 5 ⁅₁₀ ⍥₇¯₇ 5