///|
/// The specialised butterflies of the prime factor transform.
///
/// This file is generated by `tools/gen_java_kernels.py`, do not edit
/// it by hand.
///|
/// The butterfly of the radix 2 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa2`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r2_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 2
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 2)
let mut p1 = m * (1 * kfac % 2)
let mut i = 0
while i < m {
let t1r = re[p0] - re[p1]
let t1i = im[p0] - im[p1]
re[p0] = re[p0] + re[p1]
im[p0] = im[p0] + im[p1]
re[p1] = t1r
im[p1] = t1i
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 3 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa3`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r3_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 3
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 3)
let mut p1 = m * (1 * kfac % 3)
let mut p2 = m * (2 * kfac % 3)
let c1 = 0.8660254037844385
let mut i = 0
while i < m {
let t1r = re[p1] + re[p2]
let t1i = im[p1] + im[p2]
let y1r = re[p0] - 0.5 * t1r
let y1i = im[p0] - 0.5 * t1i
let y2r = c1 * (re[p1] - re[p2])
let y2i = c1 * (im[p1] - im[p2])
re[p0] = re[p0] + t1r
im[p0] = im[p0] + t1i
re[p1] = y1r - y2i
im[p1] = y1i + y2r
re[p2] = y1r + y2i
im[p2] = y1i - y2r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 3 stage of the prime factor
/// transform, for the twist 2.
///
/// This is the small transform of the original, `Pfacc.pfa3`,
/// with the twist 2. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r3_mu2(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 3
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 3)
let mut p1 = m * (1 * kfac % 3)
let mut p2 = m * (2 * kfac % 3)
let c1 = -0.8660254037844385
let mut i = 0
while i < m {
let t1r = re[p1] + re[p2]
let t1i = im[p1] + im[p2]
let y1r = re[p0] - 0.5 * t1r
let y1i = im[p0] - 0.5 * t1i
let y2r = c1 * (re[p1] - re[p2])
let y2i = c1 * (im[p1] - im[p2])
re[p0] = re[p0] + t1r
im[p0] = im[p0] + t1i
re[p1] = y1r - y2i
im[p1] = y1i + y2r
re[p2] = y1r + y2i
im[p2] = y1i - y2r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 4 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa4`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r4_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 4
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 4)
let mut p1 = m * (1 * kfac % 4)
let mut p2 = m * (2 * kfac % 4)
let mut p3 = m * (3 * kfac % 4)
let c1 = 0.9999999999999998
let mut i = 0
while i < m {
let t1r = re[p0] + re[p2]
let t1i = im[p0] + im[p2]
let t2r = re[p1] + re[p3]
let t2i = im[p1] + im[p3]
let y1r = re[p0] - re[p2]
let y1i = im[p0] - im[p2]
let y3r = c1 * (re[p1] - re[p3])
let y3i = c1 * (im[p1] - im[p3])
re[p0] = t1r + t2r
im[p0] = t1i + t2i
re[p1] = y1r - y3i
im[p1] = y1i + y3r
re[p2] = t1r - t2r
im[p2] = t1i - t2i
re[p3] = y1r + y3i
im[p3] = y1i - y3r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 4 stage of the prime factor
/// transform, for the twist 3.
///
/// This is the small transform of the original, `Pfacc.pfa4`,
/// with the twist 3. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r4_mu3(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 4
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 4)
let mut p1 = m * (1 * kfac % 4)
let mut p2 = m * (2 * kfac % 4)
let mut p3 = m * (3 * kfac % 4)
let c1 = -0.9999999999999998
let mut i = 0
while i < m {
let t1r = re[p0] + re[p2]
let t1i = im[p0] + im[p2]
let t2r = re[p1] + re[p3]
let t2i = im[p1] + im[p3]
let y1r = re[p0] - re[p2]
let y1i = im[p0] - im[p2]
let y3r = c1 * (re[p1] - re[p3])
let y3i = c1 * (im[p1] - im[p3])
re[p0] = t1r + t2r
im[p0] = t1i + t2i
re[p1] = y1r - y3i
im[p1] = y1i + y3r
re[p2] = t1r - t2r
im[p2] = t1i - t2i
re[p3] = y1r + y3i
im[p3] = y1i - y3r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 5 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa5`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r5_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 5
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 5)
let mut p1 = m * (1 * kfac % 5)
let mut p2 = m * (2 * kfac % 5)
let mut p3 = m * (3 * kfac % 5)
let mut p4 = m * (4 * kfac % 5)
let c1 = 0.5590169943749473
let c2 = 0.9510565162951535
let c3 = 0.5877852522924731
let mut i = 0
while i < m {
let t1r = re[p1] + re[p4]
let t1i = im[p1] + im[p4]
let t2r = re[p2] + re[p3]
let t2i = im[p2] + im[p3]
let t3r = re[p1] - re[p4]
let t3i = im[p1] - im[p4]
let t4r = re[p2] - re[p3]
let t4i = im[p2] - im[p3]
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = c1 * (t1r - t2r)
let t6i = c1 * (t1i - t2i)
let t7r = re[p0] - 0.25 * t5r
let t7i = im[p0] - 0.25 * t5i
let y1r = t7r + t6r
let y1i = t7i + t6i
let y2r = t7r - t6r
let y2i = t7i - t6i
let y3r = c3 * t3r - c2 * t4r
let y3i = c3 * t3i - c2 * t4i
let y4r = c2 * t3r + c3 * t4r
let y4i = c2 * t3i + c3 * t4i
re[p0] = re[p0] + t5r
im[p0] = im[p0] + t5i
re[p1] = y1r - y4i
im[p1] = y1i + y4r
re[p2] = y2r - y3i
im[p2] = y2i + y3r
re[p3] = y2r + y3i
im[p3] = y2i - y3r
re[p4] = y1r + y4i
im[p4] = y1i - y4r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 5 stage of the prime factor
/// transform, for the twist 2.
///
/// This is the small transform of the original, `Pfacc.pfa5`,
/// with the twist 2. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r5_mu2(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 5
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 5)
let mut p1 = m * (1 * kfac % 5)
let mut p2 = m * (2 * kfac % 5)
let mut p3 = m * (3 * kfac % 5)
let mut p4 = m * (4 * kfac % 5)
let c1 = -0.5590169943749472
let c2 = 0.5877852522924732
let c3 = -0.9510565162951535
let mut i = 0
while i < m {
let t1r = re[p1] + re[p4]
let t1i = im[p1] + im[p4]
let t2r = re[p2] + re[p3]
let t2i = im[p2] + im[p3]
let t3r = re[p1] - re[p4]
let t3i = im[p1] - im[p4]
let t4r = re[p2] - re[p3]
let t4i = im[p2] - im[p3]
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = c1 * (t1r - t2r)
let t6i = c1 * (t1i - t2i)
let t7r = re[p0] - 0.25 * t5r
let t7i = im[p0] - 0.25 * t5i
let y1r = t7r + t6r
let y1i = t7i + t6i
let y2r = t7r - t6r
let y2i = t7i - t6i
let y3r = c3 * t3r - c2 * t4r
let y3i = c3 * t3i - c2 * t4i
let y4r = c2 * t3r + c3 * t4r
let y4i = c2 * t3i + c3 * t4i
re[p0] = re[p0] + t5r
im[p0] = im[p0] + t5i
re[p1] = y1r - y4i
im[p1] = y1i + y4r
re[p2] = y2r - y3i
im[p2] = y2i + y3r
re[p3] = y2r + y3i
im[p3] = y2i - y3r
re[p4] = y1r + y4i
im[p4] = y1i - y4r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 5 stage of the prime factor
/// transform, for the twist 3.
///
/// This is the small transform of the original, `Pfacc.pfa5`,
/// with the twist 3. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r5_mu3(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 5
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 5)
let mut p1 = m * (1 * kfac % 5)
let mut p2 = m * (2 * kfac % 5)
let mut p3 = m * (3 * kfac % 5)
let mut p4 = m * (4 * kfac % 5)
let c1 = -0.5590169943749473
let c2 = -0.587785252292473
let c3 = 0.9510565162951535
let mut i = 0
while i < m {
let t1r = re[p1] + re[p4]
let t1i = im[p1] + im[p4]
let t2r = re[p2] + re[p3]
let t2i = im[p2] + im[p3]
let t3r = re[p1] - re[p4]
let t3i = im[p1] - im[p4]
let t4r = re[p2] - re[p3]
let t4i = im[p2] - im[p3]
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = c1 * (t1r - t2r)
let t6i = c1 * (t1i - t2i)
let t7r = re[p0] - 0.25 * t5r
let t7i = im[p0] - 0.25 * t5i
let y1r = t7r + t6r
let y1i = t7i + t6i
let y2r = t7r - t6r
let y2i = t7i - t6i
let y3r = c3 * t3r - c2 * t4r
let y3i = c3 * t3i - c2 * t4i
let y4r = c2 * t3r + c3 * t4r
let y4i = c2 * t3i + c3 * t4i
re[p0] = re[p0] + t5r
im[p0] = im[p0] + t5i
re[p1] = y1r - y4i
im[p1] = y1i + y4r
re[p2] = y2r - y3i
im[p2] = y2i + y3r
re[p3] = y2r + y3i
im[p3] = y2i - y3r
re[p4] = y1r + y4i
im[p4] = y1i - y4r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 5 stage of the prime factor
/// transform, for the twist 4.
///
/// This is the small transform of the original, `Pfacc.pfa5`,
/// with the twist 4. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r5_mu4(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 5
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 5)
let mut p1 = m * (1 * kfac % 5)
let mut p2 = m * (2 * kfac % 5)
let mut p3 = m * (3 * kfac % 5)
let mut p4 = m * (4 * kfac % 5)
let c1 = 0.5590169943749472
let c2 = -0.9510565162951535
let c3 = -0.5877852522924729
let mut i = 0
while i < m {
let t1r = re[p1] + re[p4]
let t1i = im[p1] + im[p4]
let t2r = re[p2] + re[p3]
let t2i = im[p2] + im[p3]
let t3r = re[p1] - re[p4]
let t3i = im[p1] - im[p4]
let t4r = re[p2] - re[p3]
let t4i = im[p2] - im[p3]
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = c1 * (t1r - t2r)
let t6i = c1 * (t1i - t2i)
let t7r = re[p0] - 0.25 * t5r
let t7i = im[p0] - 0.25 * t5i
let y1r = t7r + t6r
let y1i = t7i + t6i
let y2r = t7r - t6r
let y2i = t7i - t6i
let y3r = c3 * t3r - c2 * t4r
let y3i = c3 * t3i - c2 * t4i
let y4r = c2 * t3r + c3 * t4r
let y4i = c2 * t3i + c3 * t4i
re[p0] = re[p0] + t5r
im[p0] = im[p0] + t5i
re[p1] = y1r - y4i
im[p1] = y1i + y4r
re[p2] = y2r - y3i
im[p2] = y2i + y3r
re[p3] = y2r + y3i
im[p3] = y2i - y3r
re[p4] = y1r + y4i
im[p4] = y1i - y4r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 7 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa7`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r7_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 7
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 7)
let mut p1 = m * (1 * kfac % 7)
let mut p2 = m * (2 * kfac % 7)
let mut p3 = m * (3 * kfac % 7)
let mut p4 = m * (4 * kfac % 7)
let mut p5 = m * (5 * kfac % 7)
let mut p6 = m * (6 * kfac % 7)
let c1 = 0.623489801858733
let c2 = -0.22252093395631367
let c3 = -0.9009688679024188
let c4 = 0.7818314824680297
let c5 = 0.974927912181824
let c6 = 0.4338837391175582
let mut i = 0
while i < m {
let t1r = re[p1] + re[p6]
let t1i = im[p1] + im[p6]
let t2r = re[p2] + re[p5]
let t2i = im[p2] + im[p5]
let t3r = re[p3] + re[p4]
let t3i = im[p3] + im[p4]
let t4r = re[p1] - re[p6]
let t4i = im[p1] - im[p6]
let t5r = re[p2] - re[p5]
let t5i = im[p2] - im[p5]
let t6r = re[p3] - re[p4]
let t6i = im[p3] - im[p4]
let t7r = re[p0] - 0.5 * t3r
let t7i = im[p0] - 0.5 * t3i
let t8r = t1r - t3r
let t8i = t1i - t3i
let t9r = t2r - t3r
let t9i = t2i - t3i
let y1r = t7r + c1 * t8r + c2 * t9r
let y1i = t7i + c1 * t8i + c2 * t9i
let y2r = t7r + c2 * t8r + c3 * t9r
let y2i = t7i + c2 * t8i + c3 * t9i
let y3r = t7r + c3 * t8r + c1 * t9r
let y3i = t7i + c3 * t8i + c1 * t9i
let y4r = c6 * t4r - c4 * t5r + c5 * t6r
let y4i = c6 * t4i - c4 * t5i + c5 * t6i
let y5r = c5 * t4r - c6 * t5r - c4 * t6r
let y5i = c5 * t4i - c6 * t5i - c4 * t6i
let y6r = c4 * t4r + c5 * t5r + c6 * t6r
let y6i = c4 * t4i + c5 * t5i + c6 * t6i
re[p0] = re[p0] + t1r + t2r + t3r
im[p0] = im[p0] + t1i + t2i + t3i
re[p1] = y1r - y6i
im[p1] = y1i + y6r
re[p2] = y2r - y5i
im[p2] = y2i + y5r
re[p3] = y3r - y4i
im[p3] = y3i + y4r
re[p4] = y3r + y4i
im[p4] = y3i - y4r
re[p5] = y2r + y5i
im[p5] = y2i - y5r
re[p6] = y1r + y6i
im[p6] = y1i - y6r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 7 stage of the prime factor
/// transform, for the twist 2.
///
/// This is the small transform of the original, `Pfacc.pfa7`,
/// with the twist 2. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r7_mu2(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 7
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 7)
let mut p1 = m * (1 * kfac % 7)
let mut p2 = m * (2 * kfac % 7)
let mut p3 = m * (3 * kfac % 7)
let mut p4 = m * (4 * kfac % 7)
let mut p5 = m * (5 * kfac % 7)
let mut p6 = m * (6 * kfac % 7)
let c1 = -0.2225209339563139
let c2 = -0.9009688679024196
let c3 = 0.6234898018587336
let c4 = 0.974927912181824
let c5 = -0.433883739117557
let c6 = -0.7818314824680299
let mut i = 0
while i < m {
let t1r = re[p1] + re[p6]
let t1i = im[p1] + im[p6]
let t2r = re[p2] + re[p5]
let t2i = im[p2] + im[p5]
let t3r = re[p3] + re[p4]
let t3i = im[p3] + im[p4]
let t4r = re[p1] - re[p6]
let t4i = im[p1] - im[p6]
let t5r = re[p2] - re[p5]
let t5i = im[p2] - im[p5]
let t6r = re[p3] - re[p4]
let t6i = im[p3] - im[p4]
let t7r = re[p0] - 0.5 * t3r
let t7i = im[p0] - 0.5 * t3i
let t8r = t1r - t3r
let t8i = t1i - t3i
let t9r = t2r - t3r
let t9i = t2i - t3i
let y1r = t7r + c1 * t8r + c2 * t9r
let y1i = t7i + c1 * t8i + c2 * t9i
let y2r = t7r + c2 * t8r + c3 * t9r
let y2i = t7i + c2 * t8i + c3 * t9i
let y3r = t7r + c3 * t8r + c1 * t9r
let y3i = t7i + c3 * t8i + c1 * t9i
let y4r = c6 * t4r - c4 * t5r + c5 * t6r
let y4i = c6 * t4i - c4 * t5i + c5 * t6i
let y5r = c5 * t4r - c6 * t5r - c4 * t6r
let y5i = c5 * t4i - c6 * t5i - c4 * t6i
let y6r = c4 * t4r + c5 * t5r + c6 * t6r
let y6i = c4 * t4i + c5 * t5i + c6 * t6i
re[p0] = re[p0] + t1r + t2r + t3r
im[p0] = im[p0] + t1i + t2i + t3i
re[p1] = y1r - y6i
im[p1] = y1i + y6r
re[p2] = y2r - y5i
im[p2] = y2i + y5r
re[p3] = y3r - y4i
im[p3] = y3i + y4r
re[p4] = y3r + y4i
im[p4] = y3i - y4r
re[p5] = y2r + y5i
im[p5] = y2i - y5r
re[p6] = y1r + y6i
im[p6] = y1i - y6r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 7 stage of the prime factor
/// transform, for the twist 3.
///
/// This is the small transform of the original, `Pfacc.pfa7`,
/// with the twist 3. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r7_mu3(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 7
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 7)
let mut p1 = m * (1 * kfac % 7)
let mut p2 = m * (2 * kfac % 7)
let mut p3 = m * (3 * kfac % 7)
let mut p4 = m * (4 * kfac % 7)
let mut p5 = m * (5 * kfac % 7)
let mut p6 = m * (6 * kfac % 7)
let c1 = -0.9009688679024188
let c2 = 0.6234898018587326
let c3 = -0.22252093395631445
let c4 = 0.4338837391175579
let c5 = -0.7818314824680308
let c6 = 0.9749279121818237
let mut i = 0
while i < m {
let t1r = re[p1] + re[p6]
let t1i = im[p1] + im[p6]
let t2r = re[p2] + re[p5]
let t2i = im[p2] + im[p5]
let t3r = re[p3] + re[p4]
let t3i = im[p3] + im[p4]
let t4r = re[p1] - re[p6]
let t4i = im[p1] - im[p6]
let t5r = re[p2] - re[p5]
let t5i = im[p2] - im[p5]
let t6r = re[p3] - re[p4]
let t6i = im[p3] - im[p4]
let t7r = re[p0] - 0.5 * t3r
let t7i = im[p0] - 0.5 * t3i
let t8r = t1r - t3r
let t8i = t1i - t3i
let t9r = t2r - t3r
let t9i = t2i - t3i
let y1r = t7r + c1 * t8r + c2 * t9r
let y1i = t7i + c1 * t8i + c2 * t9i
let y2r = t7r + c2 * t8r + c3 * t9r
let y2i = t7i + c2 * t8i + c3 * t9i
let y3r = t7r + c3 * t8r + c1 * t9r
let y3i = t7i + c3 * t8i + c1 * t9i
let y4r = c6 * t4r - c4 * t5r + c5 * t6r
let y4i = c6 * t4i - c4 * t5i + c5 * t6i
let y5r = c5 * t4r - c6 * t5r - c4 * t6r
let y5i = c5 * t4i - c6 * t5i - c4 * t6i
let y6r = c4 * t4r + c5 * t5r + c6 * t6r
let y6i = c4 * t4i + c5 * t5i + c6 * t6i
re[p0] = re[p0] + t1r + t2r + t3r
im[p0] = im[p0] + t1i + t2i + t3i
re[p1] = y1r - y6i
im[p1] = y1i + y6r
re[p2] = y2r - y5i
im[p2] = y2i + y5r
re[p3] = y3r - y4i
im[p3] = y3i + y4r
re[p4] = y3r + y4i
im[p4] = y3i - y4r
re[p5] = y2r + y5i
im[p5] = y2i - y5r
re[p6] = y1r + y6i
im[p6] = y1i - y6r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 7 stage of the prime factor
/// transform, for the twist 4.
///
/// This is the small transform of the original, `Pfacc.pfa7`,
/// with the twist 4. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r7_mu4(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 7
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 7)
let mut p1 = m * (1 * kfac % 7)
let mut p2 = m * (2 * kfac % 7)
let mut p3 = m * (3 * kfac % 7)
let mut p4 = m * (4 * kfac % 7)
let mut p5 = m * (5 * kfac % 7)
let mut p6 = m * (6 * kfac % 7)
let c1 = -0.9009688679024195
let c2 = 0.6234898018587354
let c3 = -0.22252093395631467
let c4 = -0.433883739117557
let c5 = 0.7818314824680284
let c6 = -0.9749279121818236
let mut i = 0
while i < m {
let t1r = re[p1] + re[p6]
let t1i = im[p1] + im[p6]
let t2r = re[p2] + re[p5]
let t2i = im[p2] + im[p5]
let t3r = re[p3] + re[p4]
let t3i = im[p3] + im[p4]
let t4r = re[p1] - re[p6]
let t4i = im[p1] - im[p6]
let t5r = re[p2] - re[p5]
let t5i = im[p2] - im[p5]
let t6r = re[p3] - re[p4]
let t6i = im[p3] - im[p4]
let t7r = re[p0] - 0.5 * t3r
let t7i = im[p0] - 0.5 * t3i
let t8r = t1r - t3r
let t8i = t1i - t3i
let t9r = t2r - t3r
let t9i = t2i - t3i
let y1r = t7r + c1 * t8r + c2 * t9r
let y1i = t7i + c1 * t8i + c2 * t9i
let y2r = t7r + c2 * t8r + c3 * t9r
let y2i = t7i + c2 * t8i + c3 * t9i
let y3r = t7r + c3 * t8r + c1 * t9r
let y3i = t7i + c3 * t8i + c1 * t9i
let y4r = c6 * t4r - c4 * t5r + c5 * t6r
let y4i = c6 * t4i - c4 * t5i + c5 * t6i
let y5r = c5 * t4r - c6 * t5r - c4 * t6r
let y5i = c5 * t4i - c6 * t5i - c4 * t6i
let y6r = c4 * t4r + c5 * t5r + c6 * t6r
let y6i = c4 * t4i + c5 * t5i + c6 * t6i
re[p0] = re[p0] + t1r + t2r + t3r
im[p0] = im[p0] + t1i + t2i + t3i
re[p1] = y1r - y6i
im[p1] = y1i + y6r
re[p2] = y2r - y5i
im[p2] = y2i + y5r
re[p3] = y3r - y4i
im[p3] = y3i + y4r
re[p4] = y3r + y4i
im[p4] = y3i - y4r
re[p5] = y2r + y5i
im[p5] = y2i - y5r
re[p6] = y1r + y6i
im[p6] = y1i - y6r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 7 stage of the prime factor
/// transform, for the twist 5.
///
/// This is the small transform of the original, `Pfacc.pfa7`,
/// with the twist 5. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r7_mu5(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 7
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 7)
let mut p1 = m * (1 * kfac % 7)
let mut p2 = m * (2 * kfac % 7)
let mut p3 = m * (3 * kfac % 7)
let mut p4 = m * (4 * kfac % 7)
let mut p5 = m * (5 * kfac % 7)
let mut p6 = m * (6 * kfac % 7)
let c1 = -0.2225209339563166
let c2 = -0.9009688679024178
let c3 = 0.6234898018587349
let c4 = -0.9749279121818233
let c5 = 0.4338837391175592
let c6 = 0.7818314824680295
let mut i = 0
while i < m {
let t1r = re[p1] + re[p6]
let t1i = im[p1] + im[p6]
let t2r = re[p2] + re[p5]
let t2i = im[p2] + im[p5]
let t3r = re[p3] + re[p4]
let t3i = im[p3] + im[p4]
let t4r = re[p1] - re[p6]
let t4i = im[p1] - im[p6]
let t5r = re[p2] - re[p5]
let t5i = im[p2] - im[p5]
let t6r = re[p3] - re[p4]
let t6i = im[p3] - im[p4]
let t7r = re[p0] - 0.5 * t3r
let t7i = im[p0] - 0.5 * t3i
let t8r = t1r - t3r
let t8i = t1i - t3i
let t9r = t2r - t3r
let t9i = t2i - t3i
let y1r = t7r + c1 * t8r + c2 * t9r
let y1i = t7i + c1 * t8i + c2 * t9i
let y2r = t7r + c2 * t8r + c3 * t9r
let y2i = t7i + c2 * t8i + c3 * t9i
let y3r = t7r + c3 * t8r + c1 * t9r
let y3i = t7i + c3 * t8i + c1 * t9i
let y4r = c6 * t4r - c4 * t5r + c5 * t6r
let y4i = c6 * t4i - c4 * t5i + c5 * t6i
let y5r = c5 * t4r - c6 * t5r - c4 * t6r
let y5i = c5 * t4i - c6 * t5i - c4 * t6i
let y6r = c4 * t4r + c5 * t5r + c6 * t6r
let y6i = c4 * t4i + c5 * t5i + c6 * t6i
re[p0] = re[p0] + t1r + t2r + t3r
im[p0] = im[p0] + t1i + t2i + t3i
re[p1] = y1r - y6i
im[p1] = y1i + y6r
re[p2] = y2r - y5i
im[p2] = y2i + y5r
re[p3] = y3r - y4i
im[p3] = y3i + y4r
re[p4] = y3r + y4i
im[p4] = y3i - y4r
re[p5] = y2r + y5i
im[p5] = y2i - y5r
re[p6] = y1r + y6i
im[p6] = y1i - y6r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 7 stage of the prime factor
/// transform, for the twist 6.
///
/// This is the small transform of the original, `Pfacc.pfa7`,
/// with the twist 6. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r7_mu6(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 7
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 7)
let mut p1 = m * (1 * kfac % 7)
let mut p2 = m * (2 * kfac % 7)
let mut p3 = m * (3 * kfac % 7)
let mut p4 = m * (4 * kfac % 7)
let mut p5 = m * (5 * kfac % 7)
let mut p6 = m * (6 * kfac % 7)
let c1 = 0.623489801858734
let c2 = -0.222520933956316
let c3 = -0.9009688679024184
let c4 = -0.7818314824680295
let c5 = -0.9749279121818233
let c6 = -0.4338837391175583
let mut i = 0
while i < m {
let t1r = re[p1] + re[p6]
let t1i = im[p1] + im[p6]
let t2r = re[p2] + re[p5]
let t2i = im[p2] + im[p5]
let t3r = re[p3] + re[p4]
let t3i = im[p3] + im[p4]
let t4r = re[p1] - re[p6]
let t4i = im[p1] - im[p6]
let t5r = re[p2] - re[p5]
let t5i = im[p2] - im[p5]
let t6r = re[p3] - re[p4]
let t6i = im[p3] - im[p4]
let t7r = re[p0] - 0.5 * t3r
let t7i = im[p0] - 0.5 * t3i
let t8r = t1r - t3r
let t8i = t1i - t3i
let t9r = t2r - t3r
let t9i = t2i - t3i
let y1r = t7r + c1 * t8r + c2 * t9r
let y1i = t7i + c1 * t8i + c2 * t9i
let y2r = t7r + c2 * t8r + c3 * t9r
let y2i = t7i + c2 * t8i + c3 * t9i
let y3r = t7r + c3 * t8r + c1 * t9r
let y3i = t7i + c3 * t8i + c1 * t9i
let y4r = c6 * t4r - c4 * t5r + c5 * t6r
let y4i = c6 * t4i - c4 * t5i + c5 * t6i
let y5r = c5 * t4r - c6 * t5r - c4 * t6r
let y5i = c5 * t4i - c6 * t5i - c4 * t6i
let y6r = c4 * t4r + c5 * t5r + c6 * t6r
let y6i = c4 * t4i + c5 * t5i + c6 * t6i
re[p0] = re[p0] + t1r + t2r + t3r
im[p0] = im[p0] + t1i + t2i + t3i
re[p1] = y1r - y6i
im[p1] = y1i + y6r
re[p2] = y2r - y5i
im[p2] = y2i + y5r
re[p3] = y3r - y4i
im[p3] = y3i + y4r
re[p4] = y3r + y4i
im[p4] = y3i - y4r
re[p5] = y2r + y5i
im[p5] = y2i - y5r
re[p6] = y1r + y6i
im[p6] = y1i - y6r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 8 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa8`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r8_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 8
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 8)
let mut p1 = m * (1 * kfac % 8)
let mut p2 = m * (2 * kfac % 8)
let mut p3 = m * (3 * kfac % 8)
let mut p4 = m * (4 * kfac % 8)
let mut p5 = m * (5 * kfac % 8)
let mut p6 = m * (6 * kfac % 8)
let mut p7 = m * (7 * kfac % 8)
let c1 = 0.9999999999999998
let c2 = 0.7071067811865474
let c3 = 0.7071067811865472
let mut i = 0
while i < m {
let t1r = re[p0] + re[p4]
let t1i = im[p0] + im[p4]
let t2r = re[p0] - re[p4]
let t2i = im[p0] - im[p4]
let t3r = re[p1] + re[p5]
let t3i = im[p1] + im[p5]
let t4r = re[p1] - re[p5]
let t4i = im[p1] - im[p5]
let t5r = re[p2] + re[p6]
let t5i = im[p2] + im[p6]
let t6r = c1 * (re[p2] - re[p6])
let t6i = c1 * (im[p2] - im[p6])
let t7r = re[p3] + re[p7]
let t7i = im[p3] + im[p7]
let t8r = re[p3] - re[p7]
let t8i = im[p3] - im[p7]
let t9r = t1r + t5r
let t9i = t1i + t5i
let t10r = t3r + t7r
let t10i = t3i + t7i
let t11r = c2 * (t4r - t8r)
let t11i = c2 * (t4i - t8i)
let t12r = c3 * (t4r + t8r)
let t12i = c3 * (t4i + t8i)
let y1r = t2r + t11r
let y1i = t2i + t11i
let y2r = t1r - t5r
let y2i = t1i - t5i
let y3r = t2r - t11r
let y3i = t2i - t11i
let y5r = t12r - t6r
let y5i = t12i - t6i
let y6r = c1 * (t3r - t7r)
let y6i = c1 * (t3i - t7i)
let y7r = t12r + t6r
let y7i = t12i + t6i
re[p0] = t9r + t10r
im[p0] = t9i + t10i
re[p1] = y1r - y7i
im[p1] = y1i + y7r
re[p2] = y2r - y6i
im[p2] = y2i + y6r
re[p3] = y3r - y5i
im[p3] = y3i + y5r
re[p4] = t9r - t10r
im[p4] = t9i - t10i
re[p5] = y3r + y5i
im[p5] = y3i - y5r
re[p6] = y2r + y6i
im[p6] = y2i - y6r
re[p7] = y1r + y7i
im[p7] = y1i - y7r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 8 stage of the prime factor
/// transform, for the twist 3.
///
/// This is the small transform of the original, `Pfacc.pfa8`,
/// with the twist 3. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r8_mu3(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 8
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 8)
let mut p1 = m * (1 * kfac % 8)
let mut p2 = m * (2 * kfac % 8)
let mut p3 = m * (3 * kfac % 8)
let mut p4 = m * (4 * kfac % 8)
let mut p5 = m * (5 * kfac % 8)
let mut p6 = m * (6 * kfac % 8)
let mut p7 = m * (7 * kfac % 8)
let c1 = -0.9999999999999998
let c2 = -0.7071067811865481
let c3 = 0.707106781186548
let mut i = 0
while i < m {
let t1r = re[p0] + re[p4]
let t1i = im[p0] + im[p4]
let t2r = re[p0] - re[p4]
let t2i = im[p0] - im[p4]
let t3r = re[p1] + re[p5]
let t3i = im[p1] + im[p5]
let t4r = re[p1] - re[p5]
let t4i = im[p1] - im[p5]
let t5r = re[p2] + re[p6]
let t5i = im[p2] + im[p6]
let t6r = c1 * (re[p2] - re[p6])
let t6i = c1 * (im[p2] - im[p6])
let t7r = re[p3] + re[p7]
let t7i = im[p3] + im[p7]
let t8r = re[p3] - re[p7]
let t8i = im[p3] - im[p7]
let t9r = t1r + t5r
let t9i = t1i + t5i
let t10r = t3r + t7r
let t10i = t3i + t7i
let t11r = c2 * (t4r - t8r)
let t11i = c2 * (t4i - t8i)
let t12r = c3 * (t4r + t8r)
let t12i = c3 * (t4i + t8i)
let y1r = t2r + t11r
let y1i = t2i + t11i
let y2r = t1r - t5r
let y2i = t1i - t5i
let y3r = t2r - t11r
let y3i = t2i - t11i
let y5r = t12r - t6r
let y5i = t12i - t6i
let y6r = c1 * (t3r - t7r)
let y6i = c1 * (t3i - t7i)
let y7r = t12r + t6r
let y7i = t12i + t6i
re[p0] = t9r + t10r
im[p0] = t9i + t10i
re[p1] = y1r - y7i
im[p1] = y1i + y7r
re[p2] = y2r - y6i
im[p2] = y2i + y6r
re[p3] = y3r - y5i
im[p3] = y3i + y5r
re[p4] = t9r - t10r
im[p4] = t9i - t10i
re[p5] = y3r + y5i
im[p5] = y3i - y5r
re[p6] = y2r + y6i
im[p6] = y2i - y6r
re[p7] = y1r + y7i
im[p7] = y1i - y7r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 8 stage of the prime factor
/// transform, for the twist 5.
///
/// This is the small transform of the original, `Pfacc.pfa8`,
/// with the twist 5. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r8_mu5(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 8
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 8)
let mut p1 = m * (1 * kfac % 8)
let mut p2 = m * (2 * kfac % 8)
let mut p3 = m * (3 * kfac % 8)
let mut p4 = m * (4 * kfac % 8)
let mut p5 = m * (5 * kfac % 8)
let mut p6 = m * (6 * kfac % 8)
let mut p7 = m * (7 * kfac % 8)
let c1 = 0.9999999999999998
let c2 = -0.7071067811865475
let c3 = -0.7071067811865474
let mut i = 0
while i < m {
let t1r = re[p0] + re[p4]
let t1i = im[p0] + im[p4]
let t2r = re[p0] - re[p4]
let t2i = im[p0] - im[p4]
let t3r = re[p1] + re[p5]
let t3i = im[p1] + im[p5]
let t4r = re[p1] - re[p5]
let t4i = im[p1] - im[p5]
let t5r = re[p2] + re[p6]
let t5i = im[p2] + im[p6]
let t6r = c1 * (re[p2] - re[p6])
let t6i = c1 * (im[p2] - im[p6])
let t7r = re[p3] + re[p7]
let t7i = im[p3] + im[p7]
let t8r = re[p3] - re[p7]
let t8i = im[p3] - im[p7]
let t9r = t1r + t5r
let t9i = t1i + t5i
let t10r = t3r + t7r
let t10i = t3i + t7i
let t11r = c2 * (t4r - t8r)
let t11i = c2 * (t4i - t8i)
let t12r = c3 * (t4r + t8r)
let t12i = c3 * (t4i + t8i)
let y1r = t2r + t11r
let y1i = t2i + t11i
let y2r = t1r - t5r
let y2i = t1i - t5i
let y3r = t2r - t11r
let y3i = t2i - t11i
let y5r = t12r - t6r
let y5i = t12i - t6i
let y6r = c1 * (t3r - t7r)
let y6i = c1 * (t3i - t7i)
let y7r = t12r + t6r
let y7i = t12i + t6i
re[p0] = t9r + t10r
im[p0] = t9i + t10i
re[p1] = y1r - y7i
im[p1] = y1i + y7r
re[p2] = y2r - y6i
im[p2] = y2i + y6r
re[p3] = y3r - y5i
im[p3] = y3i + y5r
re[p4] = t9r - t10r
im[p4] = t9i - t10i
re[p5] = y3r + y5i
im[p5] = y3i - y5r
re[p6] = y2r + y6i
im[p6] = y2i - y6r
re[p7] = y1r + y7i
im[p7] = y1i - y7r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 8 stage of the prime factor
/// transform, for the twist 7.
///
/// This is the small transform of the original, `Pfacc.pfa8`,
/// with the twist 7. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r8_mu7(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 8
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 8)
let mut p1 = m * (1 * kfac % 8)
let mut p2 = m * (2 * kfac % 8)
let mut p3 = m * (3 * kfac % 8)
let mut p4 = m * (4 * kfac % 8)
let mut p5 = m * (5 * kfac % 8)
let mut p6 = m * (6 * kfac % 8)
let mut p7 = m * (7 * kfac % 8)
let c1 = -0.9999999999999998
let c2 = 0.7071067811865449
let c3 = -0.7071067811865448
let mut i = 0
while i < m {
let t1r = re[p0] + re[p4]
let t1i = im[p0] + im[p4]
let t2r = re[p0] - re[p4]
let t2i = im[p0] - im[p4]
let t3r = re[p1] + re[p5]
let t3i = im[p1] + im[p5]
let t4r = re[p1] - re[p5]
let t4i = im[p1] - im[p5]
let t5r = re[p2] + re[p6]
let t5i = im[p2] + im[p6]
let t6r = c1 * (re[p2] - re[p6])
let t6i = c1 * (im[p2] - im[p6])
let t7r = re[p3] + re[p7]
let t7i = im[p3] + im[p7]
let t8r = re[p3] - re[p7]
let t8i = im[p3] - im[p7]
let t9r = t1r + t5r
let t9i = t1i + t5i
let t10r = t3r + t7r
let t10i = t3i + t7i
let t11r = c2 * (t4r - t8r)
let t11i = c2 * (t4i - t8i)
let t12r = c3 * (t4r + t8r)
let t12i = c3 * (t4i + t8i)
let y1r = t2r + t11r
let y1i = t2i + t11i
let y2r = t1r - t5r
let y2i = t1i - t5i
let y3r = t2r - t11r
let y3i = t2i - t11i
let y5r = t12r - t6r
let y5i = t12i - t6i
let y6r = c1 * (t3r - t7r)
let y6i = c1 * (t3i - t7i)
let y7r = t12r + t6r
let y7i = t12i + t6i
re[p0] = t9r + t10r
im[p0] = t9i + t10i
re[p1] = y1r - y7i
im[p1] = y1i + y7r
re[p2] = y2r - y6i
im[p2] = y2i + y6r
re[p3] = y3r - y5i
im[p3] = y3i + y5r
re[p4] = t9r - t10r
im[p4] = t9i - t10i
re[p5] = y3r + y5i
im[p5] = y3i - y5r
re[p6] = y2r + y6i
im[p6] = y2i - y6r
re[p7] = y1r + y7i
im[p7] = y1i - y7r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 9 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa9`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r9_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 9
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 9)
let mut p1 = m * (1 * kfac % 9)
let mut p2 = m * (2 * kfac % 9)
let mut p3 = m * (3 * kfac % 9)
let mut p4 = m * (4 * kfac % 9)
let mut p5 = m * (5 * kfac % 9)
let mut p6 = m * (6 * kfac % 9)
let mut p7 = m * (7 * kfac % 9)
let mut p8 = m * (8 * kfac % 9)
let c1 = 0.866025403784439
let c2 = 0.7660444431189781
let c3 = 0.6427876096865394
let c4 = 0.17364817766693047
let c5 = 0.984807753012208
let c6 = 0.6634139481689387
let c7 = 0.5566703992264197
let c8 = 0.15038373318043546
let c9 = 0.8528685319524436
let mut i = 0
while i < m {
let t1r = re[p3] + re[p6]
let t1i = im[p3] + im[p6]
let t2r = re[p0] - 0.5 * t1r
let t2i = im[p0] - 0.5 * t1i
let t3r = c1 * (re[p3] - re[p6])
let t3i = c1 * (im[p3] - im[p6])
let t4r = re[p0] + t1r
let t4i = im[p0] + t1i
let t5r = re[p4] + re[p7]
let t5i = im[p4] + im[p7]
let t6r = re[p1] - 0.5 * t5r
let t6i = im[p1] - 0.5 * t5i
let t7r = re[p4] - re[p7]
let t7i = im[p4] - im[p7]
let t8r = re[p1] + t5r
let t8i = im[p1] + t5i
let t9r = re[p2] + re[p5]
let t9i = im[p2] + im[p5]
let t10r = re[p8] - 0.5 * t9r
let t10i = im[p8] - 0.5 * t9i
let t11r = re[p2] - re[p5]
let t11i = im[p2] - im[p5]
let t12r = re[p8] + t9r
let t12i = im[p8] + t9i
let t13r = t8r + t12r
let t13i = t8i + t12i
let t14r = t6r + t10r
let t14i = t6i + t10i
let t15r = t6r - t10r
let t15i = t6i - t10i
let t16r = t7r + t11r
let t16i = t7i + t11i
let t17r = t7r - t11r
let t17i = t7i - t11i
let t18r = c2 * t14r - c7 * t17r
let t18i = c2 * t14i - c7 * t17i
let t19r = c4 * t14r + c9 * t17r
let t19i = c4 * t14i + c9 * t17i
let t20r = c3 * t15r + c6 * t16r
let t20i = c3 * t15i + c6 * t16i
let t21r = c5 * t15r - c8 * t16r
let t21i = c5 * t15i - c8 * t16i
let t22r = t18r + t19r
let t22i = t18i + t19i
let t23r = t20r - t21r
let t23i = t20i - t21i
let y1r = t2r + t18r
let y1i = t2i + t18i
let y2r = t2r + t19r
let y2i = t2i + t19i
let y3r = t4r - 0.5 * t13r
let y3i = t4i - 0.5 * t13i
let y4r = t2r - t22r
let y4i = t2i - t22i
let y5r = t3r - t23r
let y5i = t3i - t23i
let y6r = c1 * (t8r - t12r)
let y6i = c1 * (t8i - t12i)
let y7r = t21r - t3r
let y7i = t21i - t3i
let y8r = t3r + t20r
let y8i = t3i + t20i
re[p0] = t4r + t13r
im[p0] = t4i + t13i
re[p1] = y1r - y8i
im[p1] = y1i + y8r
re[p2] = y2r - y7i
im[p2] = y2i + y7r
re[p3] = y3r - y6i
im[p3] = y3i + y6r
re[p4] = y4r - y5i
im[p4] = y4i + y5r
re[p5] = y4r + y5i
im[p5] = y4i - y5r
re[p6] = y3r + y6i
im[p6] = y3i - y6r
re[p7] = y2r + y7i
im[p7] = y2i - y7r
re[p8] = y1r + y8i
im[p8] = y1i - y8r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 9 stage of the prime factor
/// transform, for the twist 2.
///
/// This is the small transform of the original, `Pfacc.pfa9`,
/// with the twist 2. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r9_mu2(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 9
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 9)
let mut p1 = m * (1 * kfac % 9)
let mut p2 = m * (2 * kfac % 9)
let mut p3 = m * (3 * kfac % 9)
let mut p4 = m * (4 * kfac % 9)
let mut p5 = m * (5 * kfac % 9)
let mut p6 = m * (6 * kfac % 9)
let mut p7 = m * (7 * kfac % 9)
let mut p8 = m * (8 * kfac % 9)
let c1 = -0.8660254037844385
let c2 = 0.17364817766693086
let c3 = 0.9848077530122084
let c4 = -0.9396926207859083
let c5 = 0.3420201433256691
let c6 = -0.1503837331804357
let c7 = -0.8528685319524433
let c8 = 0.8137976813493735
let c9 = -0.29619813272602413
let mut i = 0
while i < m {
let t1r = re[p3] + re[p6]
let t1i = im[p3] + im[p6]
let t2r = re[p0] - 0.5 * t1r
let t2i = im[p0] - 0.5 * t1i
let t3r = c1 * (re[p3] - re[p6])
let t3i = c1 * (im[p3] - im[p6])
let t4r = re[p0] + t1r
let t4i = im[p0] + t1i
let t5r = re[p4] + re[p7]
let t5i = im[p4] + im[p7]
let t6r = re[p1] - 0.5 * t5r
let t6i = im[p1] - 0.5 * t5i
let t7r = re[p4] - re[p7]
let t7i = im[p4] - im[p7]
let t8r = re[p1] + t5r
let t8i = im[p1] + t5i
let t9r = re[p2] + re[p5]
let t9i = im[p2] + im[p5]
let t10r = re[p8] - 0.5 * t9r
let t10i = im[p8] - 0.5 * t9i
let t11r = re[p2] - re[p5]
let t11i = im[p2] - im[p5]
let t12r = re[p8] + t9r
let t12i = im[p8] + t9i
let t13r = t8r + t12r
let t13i = t8i + t12i
let t14r = t6r + t10r
let t14i = t6i + t10i
let t15r = t6r - t10r
let t15i = t6i - t10i
let t16r = t7r + t11r
let t16i = t7i + t11i
let t17r = t7r - t11r
let t17i = t7i - t11i
let t18r = c2 * t14r - c7 * t17r
let t18i = c2 * t14i - c7 * t17i
let t19r = c4 * t14r + c9 * t17r
let t19i = c4 * t14i + c9 * t17i
let t20r = c3 * t15r + c6 * t16r
let t20i = c3 * t15i + c6 * t16i
let t21r = c5 * t15r - c8 * t16r
let t21i = c5 * t15i - c8 * t16i
let t22r = t18r + t19r
let t22i = t18i + t19i
let t23r = t20r - t21r
let t23i = t20i - t21i
let y1r = t2r + t18r
let y1i = t2i + t18i
let y2r = t2r + t19r
let y2i = t2i + t19i
let y3r = t4r - 0.5 * t13r
let y3i = t4i - 0.5 * t13i
let y4r = t2r - t22r
let y4i = t2i - t22i
let y5r = t3r - t23r
let y5i = t3i - t23i
let y6r = c1 * (t8r - t12r)
let y6i = c1 * (t8i - t12i)
let y7r = t21r - t3r
let y7i = t21i - t3i
let y8r = t3r + t20r
let y8i = t3i + t20i
re[p0] = t4r + t13r
im[p0] = t4i + t13i
re[p1] = y1r - y8i
im[p1] = y1i + y8r
re[p2] = y2r - y7i
im[p2] = y2i + y7r
re[p3] = y3r - y6i
im[p3] = y3i + y6r
re[p4] = y4r - y5i
im[p4] = y4i + y5r
re[p5] = y4r + y5i
im[p5] = y4i - y5r
re[p6] = y3r + y6i
im[p6] = y3i - y6r
re[p7] = y2r + y7i
im[p7] = y2i - y7r
re[p8] = y1r + y8i
im[p8] = y1i - y8r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 9 stage of the prime factor
/// transform, for the twist 4.
///
/// This is the small transform of the original, `Pfacc.pfa9`,
/// with the twist 4. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r9_mu4(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 9
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 9)
let mut p1 = m * (1 * kfac % 9)
let mut p2 = m * (2 * kfac % 9)
let mut p3 = m * (3 * kfac % 9)
let mut p4 = m * (4 * kfac % 9)
let mut p5 = m * (5 * kfac % 9)
let mut p6 = m * (6 * kfac % 9)
let mut p7 = m * (7 * kfac % 9)
let mut p8 = m * (8 * kfac % 9)
let c1 = 0.8660254037844394
let c2 = -0.9396926207859084
let c3 = 0.34202014332566893
let c4 = 0.7660444431189776
let c5 = -0.6427876096865398
let c6 = -0.8137976813493745
let c7 = 0.29619813272602424
let c8 = 0.6634139481689385
let c9 = -0.5566703992264203
let mut i = 0
while i < m {
let t1r = re[p3] + re[p6]
let t1i = im[p3] + im[p6]
let t2r = re[p0] - 0.5 * t1r
let t2i = im[p0] - 0.5 * t1i
let t3r = c1 * (re[p3] - re[p6])
let t3i = c1 * (im[p3] - im[p6])
let t4r = re[p0] + t1r
let t4i = im[p0] + t1i
let t5r = re[p4] + re[p7]
let t5i = im[p4] + im[p7]
let t6r = re[p1] - 0.5 * t5r
let t6i = im[p1] - 0.5 * t5i
let t7r = re[p4] - re[p7]
let t7i = im[p4] - im[p7]
let t8r = re[p1] + t5r
let t8i = im[p1] + t5i
let t9r = re[p2] + re[p5]
let t9i = im[p2] + im[p5]
let t10r = re[p8] - 0.5 * t9r
let t10i = im[p8] - 0.5 * t9i
let t11r = re[p2] - re[p5]
let t11i = im[p2] - im[p5]
let t12r = re[p8] + t9r
let t12i = im[p8] + t9i
let t13r = t8r + t12r
let t13i = t8i + t12i
let t14r = t6r + t10r
let t14i = t6i + t10i
let t15r = t6r - t10r
let t15i = t6i - t10i
let t16r = t7r + t11r
let t16i = t7i + t11i
let t17r = t7r - t11r
let t17i = t7i - t11i
let t18r = c2 * t14r - c7 * t17r
let t18i = c2 * t14i - c7 * t17i
let t19r = c4 * t14r + c9 * t17r
let t19i = c4 * t14i + c9 * t17i
let t20r = c3 * t15r + c6 * t16r
let t20i = c3 * t15i + c6 * t16i
let t21r = c5 * t15r - c8 * t16r
let t21i = c5 * t15i - c8 * t16i
let t22r = t18r + t19r
let t22i = t18i + t19i
let t23r = t20r - t21r
let t23i = t20i - t21i
let y1r = t2r + t18r
let y1i = t2i + t18i
let y2r = t2r + t19r
let y2i = t2i + t19i
let y3r = t4r - 0.5 * t13r
let y3i = t4i - 0.5 * t13i
let y4r = t2r - t22r
let y4i = t2i - t22i
let y5r = t3r - t23r
let y5i = t3i - t23i
let y6r = c1 * (t8r - t12r)
let y6i = c1 * (t8i - t12i)
let y7r = t21r - t3r
let y7i = t21i - t3i
let y8r = t3r + t20r
let y8i = t3i + t20i
re[p0] = t4r + t13r
im[p0] = t4i + t13i
re[p1] = y1r - y8i
im[p1] = y1i + y8r
re[p2] = y2r - y7i
im[p2] = y2i + y7r
re[p3] = y3r - y6i
im[p3] = y3i + y6r
re[p4] = y4r - y5i
im[p4] = y4i + y5r
re[p5] = y4r + y5i
im[p5] = y4i - y5r
re[p6] = y3r + y6i
im[p6] = y3i - y6r
re[p7] = y2r + y7i
im[p7] = y2i - y7r
re[p8] = y1r + y8i
im[p8] = y1i - y8r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 9 stage of the prime factor
/// transform, for the twist 5.
///
/// This is the small transform of the original, `Pfacc.pfa9`,
/// with the twist 5. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r9_mu5(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 9
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 9)
let mut p1 = m * (1 * kfac % 9)
let mut p2 = m * (2 * kfac % 9)
let mut p3 = m * (3 * kfac % 9)
let mut p4 = m * (4 * kfac % 9)
let mut p5 = m * (5 * kfac % 9)
let mut p6 = m * (6 * kfac % 9)
let mut p7 = m * (7 * kfac % 9)
let mut p8 = m * (8 * kfac % 9)
let c1 = -0.8660254037844388
let c2 = -0.9396926207859077
let c3 = -0.3420201433256689
let c4 = 0.766044443118977
let c5 = 0.6427876096865384
let c6 = 0.8137976813493732
let c7 = 0.296198132726024
let c8 = -0.6634139481689376
let c9 = -0.5566703992264186
let mut i = 0
while i < m {
let t1r = re[p3] + re[p6]
let t1i = im[p3] + im[p6]
let t2r = re[p0] - 0.5 * t1r
let t2i = im[p0] - 0.5 * t1i
let t3r = c1 * (re[p3] - re[p6])
let t3i = c1 * (im[p3] - im[p6])
let t4r = re[p0] + t1r
let t4i = im[p0] + t1i
let t5r = re[p4] + re[p7]
let t5i = im[p4] + im[p7]
let t6r = re[p1] - 0.5 * t5r
let t6i = im[p1] - 0.5 * t5i
let t7r = re[p4] - re[p7]
let t7i = im[p4] - im[p7]
let t8r = re[p1] + t5r
let t8i = im[p1] + t5i
let t9r = re[p2] + re[p5]
let t9i = im[p2] + im[p5]
let t10r = re[p8] - 0.5 * t9r
let t10i = im[p8] - 0.5 * t9i
let t11r = re[p2] - re[p5]
let t11i = im[p2] - im[p5]
let t12r = re[p8] + t9r
let t12i = im[p8] + t9i
let t13r = t8r + t12r
let t13i = t8i + t12i
let t14r = t6r + t10r
let t14i = t6i + t10i
let t15r = t6r - t10r
let t15i = t6i - t10i
let t16r = t7r + t11r
let t16i = t7i + t11i
let t17r = t7r - t11r
let t17i = t7i - t11i
let t18r = c2 * t14r - c7 * t17r
let t18i = c2 * t14i - c7 * t17i
let t19r = c4 * t14r + c9 * t17r
let t19i = c4 * t14i + c9 * t17i
let t20r = c3 * t15r + c6 * t16r
let t20i = c3 * t15i + c6 * t16i
let t21r = c5 * t15r - c8 * t16r
let t21i = c5 * t15i - c8 * t16i
let t22r = t18r + t19r
let t22i = t18i + t19i
let t23r = t20r - t21r
let t23i = t20i - t21i
let y1r = t2r + t18r
let y1i = t2i + t18i
let y2r = t2r + t19r
let y2i = t2i + t19i
let y3r = t4r - 0.5 * t13r
let y3i = t4i - 0.5 * t13i
let y4r = t2r - t22r
let y4i = t2i - t22i
let y5r = t3r - t23r
let y5i = t3i - t23i
let y6r = c1 * (t8r - t12r)
let y6i = c1 * (t8i - t12i)
let y7r = t21r - t3r
let y7i = t21i - t3i
let y8r = t3r + t20r
let y8i = t3i + t20i
re[p0] = t4r + t13r
im[p0] = t4i + t13i
re[p1] = y1r - y8i
im[p1] = y1i + y8r
re[p2] = y2r - y7i
im[p2] = y2i + y7r
re[p3] = y3r - y6i
im[p3] = y3i + y6r
re[p4] = y4r - y5i
im[p4] = y4i + y5r
re[p5] = y4r + y5i
im[p5] = y4i - y5r
re[p6] = y3r + y6i
im[p6] = y3i - y6r
re[p7] = y2r + y7i
im[p7] = y2i - y7r
re[p8] = y1r + y8i
im[p8] = y1i - y8r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 9 stage of the prime factor
/// transform, for the twist 7.
///
/// This is the small transform of the original, `Pfacc.pfa9`,
/// with the twist 7. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r9_mu7(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 9
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 9)
let mut p1 = m * (1 * kfac % 9)
let mut p2 = m * (2 * kfac % 9)
let mut p3 = m * (3 * kfac % 9)
let mut p4 = m * (4 * kfac % 9)
let mut p5 = m * (5 * kfac % 9)
let mut p6 = m * (6 * kfac % 9)
let mut p7 = m * (7 * kfac % 9)
let mut p8 = m * (8 * kfac % 9)
let c1 = 0.8660254037844388
let c2 = 0.17364817766693066
let c3 = -0.9848077530122069
let c4 = -0.9396926207859089
let c5 = -0.3420201433256668
let c6 = 0.1503837331804356
let c7 = -0.8528685319524424
let c8 = -0.8137976813493742
let c9 = -0.29619813272602225
let mut i = 0
while i < m {
let t1r = re[p3] + re[p6]
let t1i = im[p3] + im[p6]
let t2r = re[p0] - 0.5 * t1r
let t2i = im[p0] - 0.5 * t1i
let t3r = c1 * (re[p3] - re[p6])
let t3i = c1 * (im[p3] - im[p6])
let t4r = re[p0] + t1r
let t4i = im[p0] + t1i
let t5r = re[p4] + re[p7]
let t5i = im[p4] + im[p7]
let t6r = re[p1] - 0.5 * t5r
let t6i = im[p1] - 0.5 * t5i
let t7r = re[p4] - re[p7]
let t7i = im[p4] - im[p7]
let t8r = re[p1] + t5r
let t8i = im[p1] + t5i
let t9r = re[p2] + re[p5]
let t9i = im[p2] + im[p5]
let t10r = re[p8] - 0.5 * t9r
let t10i = im[p8] - 0.5 * t9i
let t11r = re[p2] - re[p5]
let t11i = im[p2] - im[p5]
let t12r = re[p8] + t9r
let t12i = im[p8] + t9i
let t13r = t8r + t12r
let t13i = t8i + t12i
let t14r = t6r + t10r
let t14i = t6i + t10i
let t15r = t6r - t10r
let t15i = t6i - t10i
let t16r = t7r + t11r
let t16i = t7i + t11i
let t17r = t7r - t11r
let t17i = t7i - t11i
let t18r = c2 * t14r - c7 * t17r
let t18i = c2 * t14i - c7 * t17i
let t19r = c4 * t14r + c9 * t17r
let t19i = c4 * t14i + c9 * t17i
let t20r = c3 * t15r + c6 * t16r
let t20i = c3 * t15i + c6 * t16i
let t21r = c5 * t15r - c8 * t16r
let t21i = c5 * t15i - c8 * t16i
let t22r = t18r + t19r
let t22i = t18i + t19i
let t23r = t20r - t21r
let t23i = t20i - t21i
let y1r = t2r + t18r
let y1i = t2i + t18i
let y2r = t2r + t19r
let y2i = t2i + t19i
let y3r = t4r - 0.5 * t13r
let y3i = t4i - 0.5 * t13i
let y4r = t2r - t22r
let y4i = t2i - t22i
let y5r = t3r - t23r
let y5i = t3i - t23i
let y6r = c1 * (t8r - t12r)
let y6i = c1 * (t8i - t12i)
let y7r = t21r - t3r
let y7i = t21i - t3i
let y8r = t3r + t20r
let y8i = t3i + t20i
re[p0] = t4r + t13r
im[p0] = t4i + t13i
re[p1] = y1r - y8i
im[p1] = y1i + y8r
re[p2] = y2r - y7i
im[p2] = y2i + y7r
re[p3] = y3r - y6i
im[p3] = y3i + y6r
re[p4] = y4r - y5i
im[p4] = y4i + y5r
re[p5] = y4r + y5i
im[p5] = y4i - y5r
re[p6] = y3r + y6i
im[p6] = y3i - y6r
re[p7] = y2r + y7i
im[p7] = y2i - y7r
re[p8] = y1r + y8i
im[p8] = y1i - y8r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 9 stage of the prime factor
/// transform, for the twist 8.
///
/// This is the small transform of the original, `Pfacc.pfa9`,
/// with the twist 8. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r9_mu8(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 9
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 9)
let mut p1 = m * (1 * kfac % 9)
let mut p2 = m * (2 * kfac % 9)
let mut p3 = m * (3 * kfac % 9)
let mut p4 = m * (4 * kfac % 9)
let mut p5 = m * (5 * kfac % 9)
let mut p6 = m * (6 * kfac % 9)
let mut p7 = m * (7 * kfac % 9)
let mut p8 = m * (8 * kfac % 9)
let c1 = -0.8660254037844377
let c2 = 0.7660444431189781
let c3 = -0.6427876096865405
let c4 = 0.17364817766692886
let c5 = -0.9848077530122081
let c6 = -0.6634139481689377
let c7 = 0.5566703992264198
let c8 = -0.15038373318043385
let c9 = 0.8528685319524424
let mut i = 0
while i < m {
let t1r = re[p3] + re[p6]
let t1i = im[p3] + im[p6]
let t2r = re[p0] - 0.5 * t1r
let t2i = im[p0] - 0.5 * t1i
let t3r = c1 * (re[p3] - re[p6])
let t3i = c1 * (im[p3] - im[p6])
let t4r = re[p0] + t1r
let t4i = im[p0] + t1i
let t5r = re[p4] + re[p7]
let t5i = im[p4] + im[p7]
let t6r = re[p1] - 0.5 * t5r
let t6i = im[p1] - 0.5 * t5i
let t7r = re[p4] - re[p7]
let t7i = im[p4] - im[p7]
let t8r = re[p1] + t5r
let t8i = im[p1] + t5i
let t9r = re[p2] + re[p5]
let t9i = im[p2] + im[p5]
let t10r = re[p8] - 0.5 * t9r
let t10i = im[p8] - 0.5 * t9i
let t11r = re[p2] - re[p5]
let t11i = im[p2] - im[p5]
let t12r = re[p8] + t9r
let t12i = im[p8] + t9i
let t13r = t8r + t12r
let t13i = t8i + t12i
let t14r = t6r + t10r
let t14i = t6i + t10i
let t15r = t6r - t10r
let t15i = t6i - t10i
let t16r = t7r + t11r
let t16i = t7i + t11i
let t17r = t7r - t11r
let t17i = t7i - t11i
let t18r = c2 * t14r - c7 * t17r
let t18i = c2 * t14i - c7 * t17i
let t19r = c4 * t14r + c9 * t17r
let t19i = c4 * t14i + c9 * t17i
let t20r = c3 * t15r + c6 * t16r
let t20i = c3 * t15i + c6 * t16i
let t21r = c5 * t15r - c8 * t16r
let t21i = c5 * t15i - c8 * t16i
let t22r = t18r + t19r
let t22i = t18i + t19i
let t23r = t20r - t21r
let t23i = t20i - t21i
let y1r = t2r + t18r
let y1i = t2i + t18i
let y2r = t2r + t19r
let y2i = t2i + t19i
let y3r = t4r - 0.5 * t13r
let y3i = t4i - 0.5 * t13i
let y4r = t2r - t22r
let y4i = t2i - t22i
let y5r = t3r - t23r
let y5i = t3i - t23i
let y6r = c1 * (t8r - t12r)
let y6i = c1 * (t8i - t12i)
let y7r = t21r - t3r
let y7i = t21i - t3i
let y8r = t3r + t20r
let y8i = t3i + t20i
re[p0] = t4r + t13r
im[p0] = t4i + t13i
re[p1] = y1r - y8i
im[p1] = y1i + y8r
re[p2] = y2r - y7i
im[p2] = y2i + y7r
re[p3] = y3r - y6i
im[p3] = y3i + y6r
re[p4] = y4r - y5i
im[p4] = y4i + y5r
re[p5] = y4r + y5i
im[p5] = y4i - y5r
re[p6] = y3r + y6i
im[p6] = y3i - y6r
re[p7] = y2r + y7i
im[p7] = y2i - y7r
re[p8] = y1r + y8i
im[p8] = y1i - y8r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = 0.8412535328311812
let c2 = 0.41541501300188655
let c3 = -0.14231483827328537
let c4 = -0.6548607339452844
let c5 = -0.9594929736144978
let c6 = 0.5406408174555972
let c7 = 0.909631995354518
let c8 = 0.9898214418809327
let c9 = 0.7557495743542586
let c10 = 0.28173255684143006
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 2.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 2. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu2(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = 0.4154150130018871
let c2 = -0.6548607339452843
let c3 = -0.9594929736144975
let c4 = -0.14231483827328606
let c5 = 0.8412535328311814
let c6 = 0.909631995354518
let c7 = 0.7557495743542588
let c8 = -0.2817325568414299
let c9 = -0.9898214418809324
let c10 = -0.5406408174555981
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 3.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 3. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu3(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = -0.14231483827328514
let c2 = -0.9594929736144985
let c3 = 0.4154150130018867
let c4 = 0.8412535328311801
let c5 = -0.6548607339452848
let c6 = 0.9898214418809327
let c7 = -0.2817325568414282
let c8 = -0.9096319953545182
let c9 = 0.5406408174555988
let c10 = 0.7557495743542588
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 4.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 4. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu4(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = -0.6548607339452834
let c2 = -0.14231483827328628
let c3 = 0.841253532831181
let c4 = -0.959492973614496
let c5 = 0.4154150130018863
let c6 = 0.7557495743542586
let c7 = -0.9898214418809321
let c8 = 0.540640817455598
let c9 = 0.28173255684143245
let c10 = -0.9096319953545189
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 5.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 5. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu5(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = -0.9594929736144961
let c2 = 0.8412535328311785
let c3 = -0.6548607339452834
let c4 = 0.4154150130018866
let c5 = -0.14231483827328623
let c6 = 0.2817325568414329
let c7 = -0.540640817455602
let c8 = 0.755749574354259
let c9 = -0.9096319953545184
let c10 = 0.9898214418809324
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 6.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 6. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu6(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = -0.9594929736144963
let c2 = 0.8412535328311838
let c3 = -0.6548607339452845
let c4 = 0.41541501300188516
let c5 = -0.14231483827328717
let c6 = -0.28173255684142967
let c7 = 0.540640817455595
let c8 = -0.7557495743542577
let c9 = 0.9096319953545193
let c10 = -0.9898214418809321
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 7.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 7. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu7(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = -0.6548607339452852
let c2 = -0.1423148382732855
let c3 = 0.8412535328311794
let c4 = -0.9594929736144973
let c5 = 0.4154150130018893
let c6 = -0.7557495743542576
let c7 = 0.9898214418809324
let c8 = -0.5406408174555999
let c9 = -0.2817325568414289
let c10 = 0.9096319953545173
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 8.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 8. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu8(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = -0.14231483827328478
let c2 = -0.9594929736144939
let c3 = 0.415415013001888
let c4 = 0.8412535328311798
let c5 = -0.6548607339452852
let c6 = -0.9898214418809324
let c7 = 0.2817325568414339
let c8 = 0.9096319953545188
let c9 = -0.5406408174556023
let c10 = -0.7557495743542559
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 9.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 9. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu9(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = 0.4154150130018862
let c2 = -0.6548607339452807
let c3 = -0.9594929736144953
let c4 = -0.14231483827328623
let c5 = 0.8412535328311797
let c6 = -0.9096319953545189
let c7 = -0.755749574354261
let c8 = 0.2817325568414329
let c9 = 0.9898214418809324
let c10 = 0.5406408174556023
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 11 stage of the prime factor
/// transform, for the twist 10.
///
/// This is the small transform of the original, `Pfacc.pfa11`,
/// with the twist 10. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r11_mu10(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 11
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 11)
let mut p1 = m * (1 * kfac % 11)
let mut p2 = m * (2 * kfac % 11)
let mut p3 = m * (3 * kfac % 11)
let mut p4 = m * (4 * kfac % 11)
let mut p5 = m * (5 * kfac % 11)
let mut p6 = m * (6 * kfac % 11)
let mut p7 = m * (7 * kfac % 11)
let mut p8 = m * (8 * kfac % 11)
let mut p9 = m * (9 * kfac % 11)
let mut p10 = m * (10 * kfac % 11)
let c1 = 0.8412535328311819
let c2 = 0.41541501300188094
let c3 = -0.1423148382732831
let c4 = -0.6548607339452814
let c5 = -0.9594929736144933
let c6 = -0.5406408174556032
let c7 = -0.9096319953545227
let c8 = -0.9898214418809324
let c9 = -0.7557495743542573
let c10 = -0.28173255684143134
let mut i = 0
while i < m {
let t1r = re[p1] + re[p10]
let t1i = im[p1] + im[p10]
let t2r = re[p2] + re[p9]
let t2i = im[p2] + im[p9]
let t3r = re[p3] + re[p8]
let t3i = im[p3] + im[p8]
let t4r = re[p4] + re[p7]
let t4i = im[p4] + im[p7]
let t5r = re[p5] + re[p6]
let t5i = im[p5] + im[p6]
let t6r = re[p1] - re[p10]
let t6i = im[p1] - im[p10]
let t7r = re[p2] - re[p9]
let t7i = im[p2] - im[p9]
let t8r = re[p3] - re[p8]
let t8i = im[p3] - im[p8]
let t9r = re[p4] - re[p7]
let t9i = im[p4] - im[p7]
let t10r = re[p5] - re[p6]
let t10i = im[p5] - im[p6]
let t11r = re[p0] - 0.5 * t5r
let t11i = im[p0] - 0.5 * t5i
let t12r = t1r - t5r
let t12i = t1i - t5i
let t13r = t2r - t5r
let t13i = t2i - t5i
let t14r = t3r - t5r
let t14i = t3i - t5i
let t15r = t4r - t5r
let t15i = t4i - t5i
let y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r
let y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i
let y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r
let y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i
let y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r
let y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i
let y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r
let y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i
let y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r
let y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i
let y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r
let y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i
let y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r
let y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i
let y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r
let y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i
let y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r
let y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i
let y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r
let y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i
re[p1] = y1r - y10i
im[p1] = y1i + y10r
re[p2] = y2r - y9i
im[p2] = y2i + y9r
re[p3] = y3r - y8i
im[p3] = y3i + y8r
re[p4] = y4r - y7i
im[p4] = y4i + y7r
re[p5] = y5r - y6i
im[p5] = y5i + y6r
re[p6] = y5r + y6i
im[p6] = y5i - y6r
re[p7] = y4r + y7i
im[p7] = y4i - y7r
re[p8] = y3r + y8i
im[p8] = y3i - y8r
re[p9] = y2r + y9i
im[p9] = y2i - y9r
re[p10] = y1r + y10i
im[p10] = y1i - y10r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = 0.8854560256532104
let c2 = 0.568064746731156
let c3 = 0.12053668025532296
let c4 = -0.3546048870425344
let c5 = -0.7485107481711017
let c6 = -0.9709418174260536
let c7 = 0.46472317204376856
let c8 = 0.8229838658936562
let c9 = 0.9927088740980543
let c10 = 0.9350162426854152
let c11 = 0.6631226582407953
let c12 = 0.23931566428755782
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 2.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 2. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu2(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = 0.5680647467311563
let c2 = -0.3546048870425348
let c3 = -0.9709418174260527
let c4 = -0.7485107481711026
let c5 = 0.1205366802553231
let c6 = 0.8854560256532107
let c7 = 0.8229838658936565
let c8 = 0.9350162426854152
let c9 = 0.2393156642875578
let c10 = -0.6631226582407937
let c11 = -0.9927088740980541
let c12 = -0.4647231720437686
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 3.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 3. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu3(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = 0.12053668025532313
let c2 = -0.9709418174260512
let c3 = -0.35460488704253595
let c4 = 0.8854560256532102
let c5 = 0.5680647467311561
let c6 = -0.7485107481711026
let c7 = 0.992708874098054
let c8 = 0.2393156642875576
let c9 = -0.9350162426854149
let c10 = -0.46472317204376734
let c11 = 0.8229838658936562
let c12 = 0.6631226582407944
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 4.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 4. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu4(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = -0.35460488704253584
let c2 = -0.7485107481711042
let c3 = 0.8854560256532105
let c4 = 0.12053668025532638
let c5 = -0.9709418174260527
let c6 = 0.5680647467311561
let c7 = 0.935016242685415
let c8 = -0.6631226582407937
let c9 = -0.4647231720437686
let c10 = 0.9927088740980536
let c11 = -0.23931566428755838
let c12 = -0.8229838658936565
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 5.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 5. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu5(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = -0.7485107481711001
let c2 = 0.12053668025532419
let c3 = 0.5680647467311548
let c4 = -0.9709418174260511
let c5 = 0.8854560256532086
let c6 = -0.3546048870425378
let c7 = 0.6631226582407959
let c8 = -0.9927088740980539
let c9 = 0.8229838658936577
let c10 = -0.23931566428755793
let c11 = -0.4647231720437715
let c12 = 0.9350162426854141
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 6.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 6. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu6(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = -0.9709418174260529
let c2 = 0.8854560256532104
let c3 = -0.7485107481711026
let c4 = 0.5680647467311573
let c5 = -0.35460488704253706
let c6 = 0.1205366802553241
let c7 = 0.23931566428755802
let c8 = -0.46472317204376823
let c9 = 0.6631226582407953
let c10 = -0.8229838658936549
let c11 = 0.9350162426854149
let c12 = -0.9927088740980539
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 7.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 7. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu7(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = -0.9709418174260516
let c2 = 0.8854560256532134
let c3 = -0.7485107481711009
let c4 = 0.5680647467311528
let c5 = -0.35460488704253945
let c6 = 0.12053668025532438
let c7 = -0.23931566428755804
let c8 = 0.4647231720437657
let c9 = -0.6631226582407956
let c10 = 0.822983865893659
let c11 = -0.9350162426854134
let c12 = 0.992708874098054
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 8.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 8. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu8(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = -0.7485107481711031
let c2 = 0.12053668025532535
let c3 = 0.568064746731155
let c4 = -0.9709418174260506
let c5 = 0.8854560256532079
let c6 = -0.35460488704253773
let c7 = -0.6631226582407944
let c8 = 0.9927088740980536
let c9 = -0.8229838658936565
let c10 = 0.2393156642875659
let c11 = 0.46472317204376956
let c12 = -0.9350162426854149
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 9.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 9. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu9(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = -0.3546048870425366
let c2 = -0.7485107481711044
let c3 = 0.8854560256532115
let c4 = 0.12053668025532421
let c5 = -0.9709418174260523
let c6 = 0.5680647467311557
let c7 = -0.9350162426854147
let c8 = 0.6631226582407934
let c9 = 0.46472317204376545
let c10 = -0.9927088740980539
let c11 = 0.23931566428755724
let c12 = 0.8229838658936567
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 10.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 10. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu10(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = 0.12053668025532228
let c2 = -0.9709418174260511
let c3 = -0.3546048870425389
let c4 = 0.8854560256532104
let c5 = 0.5680647467311516
let c6 = -0.7485107481710985
let c7 = -0.9927088740980544
let c8 = -0.23931566428755974
let c9 = 0.9350162426854134
let c10 = 0.4647231720437689
let c11 = -0.8229838658936602
let c12 = -0.6631226582407989
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 11.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 11. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu11(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = 0.568064746731161
let c2 = -0.35460488704254167
let c3 = -0.9709418174260546
let c4 = -0.748510748171095
let c5 = 0.12053668025531439
let c6 = 0.8854560256532136
let c7 = -0.8229838658936527
let c8 = -0.9350162426854127
let c9 = -0.23931566428755396
let c10 = 0.6631226582408032
let c11 = 0.992708874098055
let c12 = 0.46472317204376307
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 13 stage of the prime factor
/// transform, for the twist 12.
///
/// This is the small transform of the original, `Pfacc.pfa13`,
/// with the twist 12. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r13_mu12(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 13
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 13)
let mut p1 = m * (1 * kfac % 13)
let mut p2 = m * (2 * kfac % 13)
let mut p3 = m * (3 * kfac % 13)
let mut p4 = m * (4 * kfac % 13)
let mut p5 = m * (5 * kfac % 13)
let mut p6 = m * (6 * kfac % 13)
let mut p7 = m * (7 * kfac % 13)
let mut p8 = m * (8 * kfac % 13)
let mut p9 = m * (9 * kfac % 13)
let mut p10 = m * (10 * kfac % 13)
let mut p11 = m * (11 * kfac % 13)
let mut p12 = m * (12 * kfac % 13)
let c1 = 0.8854560256532086
let c2 = 0.5680647467311549
let c3 = 0.1205366802553218
let c4 = -0.3546048870425315
let c5 = -0.7485107481711032
let c6 = -0.9709418174260542
let c7 = -0.464723172043769
let c8 = -0.8229838658936559
let c9 = -0.9927088740980541
let c10 = -0.9350162426854167
let c11 = -0.6631226582407946
let c12 = -0.2393156642875614
let mut i = 0
while i < m {
let t1r = re[p1] + re[p12]
let t1i = im[p1] + im[p12]
let t2r = re[p2] + re[p11]
let t2i = im[p2] + im[p11]
let t3r = re[p3] + re[p10]
let t3i = im[p3] + im[p10]
let t4r = re[p4] + re[p9]
let t4i = im[p4] + im[p9]
let t5r = re[p5] + re[p8]
let t5i = im[p5] + im[p8]
let t6r = re[p6] + re[p7]
let t6i = im[p6] + im[p7]
let t7r = re[p1] - re[p12]
let t7i = im[p1] - im[p12]
let t8r = re[p2] - re[p11]
let t8i = im[p2] - im[p11]
let t9r = re[p3] - re[p10]
let t9i = im[p3] - im[p10]
let t10r = re[p4] - re[p9]
let t10i = im[p4] - im[p9]
let t11r = re[p5] - re[p8]
let t11i = im[p5] - im[p8]
let t12r = re[p6] - re[p7]
let t12i = im[p6] - im[p7]
let t13r = re[p0] - 0.5 * t6r
let t13i = im[p0] - 0.5 * t6i
let t14r = t1r - t6r
let t14i = t1i - t6i
let t15r = t2r - t6r
let t15i = t2i - t6i
let t16r = t3r - t6r
let t16i = t3i - t6i
let t17r = t4r - t6r
let t17i = t4i - t6i
let t18r = t5r - t6r
let t18i = t5i - t6i
let y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r
let y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i
let y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r
let y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i
let y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r
let y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i
let y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r
let y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i
let y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r
let y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i
let y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r
let y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i
let y7r = c12 * t7r -
c7 * t8r +
c11 * t9r -
c8 * t10r +
c10 * t11r -
c9 * t12r
let y7i = c12 * t7i -
c7 * t8i +
c11 * t9i -
c8 * t10i +
c10 * t11i -
c9 * t12i
let y8r = c11 * t7r -
c9 * t8r +
c8 * t9r -
c12 * t10r -
c7 * t11r +
c10 * t12r
let y8i = c11 * t7i -
c9 * t8i +
c8 * t9i -
c12 * t10i -
c7 * t11i +
c10 * t12i
let y9r = c10 * t7r -
c11 * t8r -
c7 * t9r +
c9 * t10r -
c12 * t11r -
c8 * t12r
let y9i = c10 * t7i -
c11 * t8i -
c7 * t9i +
c9 * t10i -
c12 * t11i -
c8 * t12i
let y10r = c9 * t7r +
c12 * t8r -
c10 * t9r -
c7 * t10r +
c8 * t11r +
c11 * t12r
let y10i = c9 * t7i +
c12 * t8i -
c10 * t9i -
c7 * t10i +
c8 * t11i +
c11 * t12i
let y11r = c8 * t7r +
c10 * t8r +
c12 * t9r -
c11 * t10r -
c9 * t11r -
c7 * t12r
let y11i = c8 * t7i +
c10 * t8i +
c12 * t9i -
c11 * t10i -
c9 * t11i -
c7 * t12i
let y12r = c7 * t7r +
c8 * t8r +
c9 * t9r +
c10 * t10r +
c11 * t11r +
c12 * t12r
let y12i = c7 * t7i +
c8 * t8i +
c9 * t9i +
c10 * t10i +
c11 * t11i +
c12 * t12i
re[p0] = re[p0] + t1r + t2r + t3r + t4r + t5r + t6r
im[p0] = im[p0] + t1i + t2i + t3i + t4i + t5i + t6i
re[p1] = y1r - y12i
im[p1] = y1i + y12r
re[p2] = y2r - y11i
im[p2] = y2i + y11r
re[p3] = y3r - y10i
im[p3] = y3i + y10r
re[p4] = y4r - y9i
im[p4] = y4i + y9r
re[p5] = y5r - y8i
im[p5] = y5i + y8r
re[p6] = y6r - y7i
im[p6] = y6i + y7r
re[p7] = y6r + y7i
im[p7] = y6i - y7r
re[p8] = y5r + y8i
im[p8] = y5i - y8r
re[p9] = y4r + y9i
im[p9] = y4i - y9r
re[p10] = y3r + y10i
im[p10] = y3i - y10r
re[p11] = y2r + y11i
im[p11] = y2i - y11r
re[p12] = y1r + y12i
im[p12] = y1i - y12r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 16 stage of the prime factor
/// transform, for the twist 1.
///
/// This is the small transform of the original, `Pfacc.pfa16`,
/// with the twist 1. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r16_mu1(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 16
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 16)
let mut p1 = m * (1 * kfac % 16)
let mut p2 = m * (2 * kfac % 16)
let mut p3 = m * (3 * kfac % 16)
let mut p4 = m * (4 * kfac % 16)
let mut p5 = m * (5 * kfac % 16)
let mut p6 = m * (6 * kfac % 16)
let mut p7 = m * (7 * kfac % 16)
let mut p8 = m * (8 * kfac % 16)
let mut p9 = m * (9 * kfac % 16)
let mut p10 = m * (10 * kfac % 16)
let mut p11 = m * (11 * kfac % 16)
let mut p12 = m * (12 * kfac % 16)
let mut p13 = m * (13 * kfac % 16)
let mut p14 = m * (14 * kfac % 16)
let mut p15 = m * (15 * kfac % 16)
let c1 = 1.0
let c2 = 0.9238795325112865
let c3 = 0.3826834323650896
let c4 = 0.7071067811865475
let c5 = 0.7071067811865475
let c6 = 0.3826834323650896
let c7 = 0.9238795325112865
let mut i = 0
while i < m {
let t1r = re[p0] + re[p8]
let t1i = im[p0] + im[p8]
let t2r = re[p4] + re[p12]
let t2i = im[p4] + im[p12]
let t3r = re[p0] - re[p8]
let t3i = im[p0] - im[p8]
let t4r = c1 * (re[p4] - re[p12])
let t4i = c1 * (im[p4] - im[p12])
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = t1r - t2r
let t6i = t1i - t2i
let t7r = re[p1] + re[p9]
let t7i = im[p1] + im[p9]
let t8r = re[p5] + re[p13]
let t8i = im[p5] + im[p13]
let t9r = re[p1] - re[p9]
let t9i = im[p1] - im[p9]
let t10r = re[p5] - re[p13]
let t10i = im[p5] - im[p13]
let t11r = t7r + t8r
let t11i = t7i + t8i
let t12r = t7r - t8r
let t12i = t7i - t8i
let t13r = re[p2] + re[p10]
let t13i = im[p2] + im[p10]
let t14r = re[p6] + re[p14]
let t14i = im[p6] + im[p14]
let t15r = re[p2] - re[p10]
let t15i = im[p2] - im[p10]
let t16r = re[p6] - re[p14]
let t16i = im[p6] - im[p14]
let t17r = t13r + t14r
let t17i = t13i + t14i
let t18r = c4 * (t15r - t16r)
let t18i = c4 * (t15i - t16i)
let t19r = c5 * (t15r + t16r)
let t19i = c5 * (t15i + t16i)
let t20r = c1 * (t13r - t14r)
let t20i = c1 * (t13i - t14i)
let t21r = re[p3] + re[p11]
let t21i = im[p3] + im[p11]
let t22r = re[p7] + re[p15]
let t22i = im[p7] + im[p15]
let t23r = re[p3] - re[p11]
let t23i = im[p3] - im[p11]
let t24r = re[p7] - re[p15]
let t24i = im[p7] - im[p15]
let t25r = t21r + t22r
let t25i = t21i + t22i
let t26r = t21r - t22r
let t26i = t21i - t22i
let t27r = t9r + t24r
let t27i = t9i + t24i
let t28r = t10r + t23r
let t28i = t10i + t23i
let t29r = t9r - t24r
let t29i = t9i - t24i
let t30r = t10r - t23r
let t30i = t10i - t23i
let t31r = t5r + t17r
let t31i = t5i + t17i
let t32r = t11r + t25r
let t32i = t11i + t25i
let t33r = t3r + t18r
let t33i = t3i + t18i
let t34r = c2 * t29r - c6 * t30r
let t34i = c2 * t29i - c6 * t30i
let t35r = t3r - t18r
let t35i = t3i - t18i
let t36r = c7 * t27r - c3 * t28r
let t36i = c7 * t27i - c3 * t28i
let t37r = t4r + t19r
let t37i = t4i + t19i
let t38r = c3 * t27r + c7 * t28r
let t38i = c3 * t27i + c7 * t28i
let t39r = t4r - t19r
let t39i = t4i - t19i
let t40r = c6 * t29r + c2 * t30r
let t40i = c6 * t29i + c2 * t30i
let t41r = c4 * (t12r - t26r)
let t41i = c4 * (t12i - t26i)
let t42r = c5 * (t12r + t26r)
let t42i = c5 * (t12i + t26i)
let y1r = t33r + t34r
let y1i = t33i + t34i
let y2r = t6r + t41r
let y2i = t6i + t41i
let y3r = t35r + t40r
let y3i = t35i + t40i
let y4r = t5r - t17r
let y4i = t5i - t17i
let y5r = t35r - t40r
let y5i = t35i - t40i
let y6r = t6r - t41r
let y6i = t6i - t41i
let y7r = t33r - t34r
let y7i = t33i - t34i
let y9r = t38r - t37r
let y9i = t38i - t37i
let y10r = t42r - t20r
let y10i = t42i - t20i
let y11r = t36r + t39r
let y11i = t36i + t39i
let y12r = c1 * (t11r - t25r)
let y12i = c1 * (t11i - t25i)
let y13r = t36r - t39r
let y13i = t36i - t39i
let y14r = t42r + t20r
let y14i = t42i + t20i
let y15r = t38r + t37r
let y15i = t38i + t37i
re[p0] = t31r + t32r
im[p0] = t31i + t32i
re[p1] = y1r - y15i
im[p1] = y1i + y15r
re[p2] = y2r - y14i
im[p2] = y2i + y14r
re[p3] = y3r - y13i
im[p3] = y3i + y13r
re[p4] = y4r - y12i
im[p4] = y4i + y12r
re[p5] = y5r - y11i
im[p5] = y5i + y11r
re[p6] = y6r - y10i
im[p6] = y6i + y10r
re[p7] = y7r - y9i
im[p7] = y7i + y9r
re[p8] = t31r - t32r
im[p8] = t31i - t32i
re[p9] = y7r + y9i
im[p9] = y7i - y9r
re[p10] = y6r + y10i
im[p10] = y6i - y10r
re[p11] = y5r + y11i
im[p11] = y5i - y11r
re[p12] = y4r + y12i
im[p12] = y4i - y12r
re[p13] = y3r + y13i
im[p13] = y3i - y13r
re[p14] = y2r + y14i
im[p14] = y2i - y14r
re[p15] = y1r + y15i
im[p15] = y1i - y15r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
if p13 < limit {
p13 = p13 + mr
}
p13 = p13 + delta
if p14 < limit {
p14 = p14 + mr
}
p14 = p14 + delta
if p15 < limit {
p15 = p15 + mr
}
p15 = p15 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 16 stage of the prime factor
/// transform, for the twist 3.
///
/// This is the small transform of the original, `Pfacc.pfa16`,
/// with the twist 3. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r16_mu3(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 16
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 16)
let mut p1 = m * (1 * kfac % 16)
let mut p2 = m * (2 * kfac % 16)
let mut p3 = m * (3 * kfac % 16)
let mut p4 = m * (4 * kfac % 16)
let mut p5 = m * (5 * kfac % 16)
let mut p6 = m * (6 * kfac % 16)
let mut p7 = m * (7 * kfac % 16)
let mut p8 = m * (8 * kfac % 16)
let mut p9 = m * (9 * kfac % 16)
let mut p10 = m * (10 * kfac % 16)
let mut p11 = m * (11 * kfac % 16)
let mut p12 = m * (12 * kfac % 16)
let mut p13 = m * (13 * kfac % 16)
let mut p14 = m * (14 * kfac % 16)
let mut p15 = m * (15 * kfac % 16)
let c1 = -1.0
let c2 = 0.3826834323650883
let c3 = 0.9238795325112873
let c4 = -0.7071067811865483
let c5 = 0.7071067811865483
let c6 = -0.9238795325112873
let c7 = -0.3826834323650883
let mut i = 0
while i < m {
let t1r = re[p0] + re[p8]
let t1i = im[p0] + im[p8]
let t2r = re[p4] + re[p12]
let t2i = im[p4] + im[p12]
let t3r = re[p0] - re[p8]
let t3i = im[p0] - im[p8]
let t4r = c1 * (re[p4] - re[p12])
let t4i = c1 * (im[p4] - im[p12])
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = t1r - t2r
let t6i = t1i - t2i
let t7r = re[p1] + re[p9]
let t7i = im[p1] + im[p9]
let t8r = re[p5] + re[p13]
let t8i = im[p5] + im[p13]
let t9r = re[p1] - re[p9]
let t9i = im[p1] - im[p9]
let t10r = re[p5] - re[p13]
let t10i = im[p5] - im[p13]
let t11r = t7r + t8r
let t11i = t7i + t8i
let t12r = t7r - t8r
let t12i = t7i - t8i
let t13r = re[p2] + re[p10]
let t13i = im[p2] + im[p10]
let t14r = re[p6] + re[p14]
let t14i = im[p6] + im[p14]
let t15r = re[p2] - re[p10]
let t15i = im[p2] - im[p10]
let t16r = re[p6] - re[p14]
let t16i = im[p6] - im[p14]
let t17r = t13r + t14r
let t17i = t13i + t14i
let t18r = c4 * (t15r - t16r)
let t18i = c4 * (t15i - t16i)
let t19r = c5 * (t15r + t16r)
let t19i = c5 * (t15i + t16i)
let t20r = c1 * (t13r - t14r)
let t20i = c1 * (t13i - t14i)
let t21r = re[p3] + re[p11]
let t21i = im[p3] + im[p11]
let t22r = re[p7] + re[p15]
let t22i = im[p7] + im[p15]
let t23r = re[p3] - re[p11]
let t23i = im[p3] - im[p11]
let t24r = re[p7] - re[p15]
let t24i = im[p7] - im[p15]
let t25r = t21r + t22r
let t25i = t21i + t22i
let t26r = t21r - t22r
let t26i = t21i - t22i
let t27r = t9r + t24r
let t27i = t9i + t24i
let t28r = t10r + t23r
let t28i = t10i + t23i
let t29r = t9r - t24r
let t29i = t9i - t24i
let t30r = t10r - t23r
let t30i = t10i - t23i
let t31r = t5r + t17r
let t31i = t5i + t17i
let t32r = t11r + t25r
let t32i = t11i + t25i
let t33r = t3r + t18r
let t33i = t3i + t18i
let t34r = c2 * t29r - c6 * t30r
let t34i = c2 * t29i - c6 * t30i
let t35r = t3r - t18r
let t35i = t3i - t18i
let t36r = c7 * t27r - c3 * t28r
let t36i = c7 * t27i - c3 * t28i
let t37r = t4r + t19r
let t37i = t4i + t19i
let t38r = c3 * t27r + c7 * t28r
let t38i = c3 * t27i + c7 * t28i
let t39r = t4r - t19r
let t39i = t4i - t19i
let t40r = c6 * t29r + c2 * t30r
let t40i = c6 * t29i + c2 * t30i
let t41r = c4 * (t12r - t26r)
let t41i = c4 * (t12i - t26i)
let t42r = c5 * (t12r + t26r)
let t42i = c5 * (t12i + t26i)
let y1r = t33r + t34r
let y1i = t33i + t34i
let y2r = t6r + t41r
let y2i = t6i + t41i
let y3r = t35r + t40r
let y3i = t35i + t40i
let y4r = t5r - t17r
let y4i = t5i - t17i
let y5r = t35r - t40r
let y5i = t35i - t40i
let y6r = t6r - t41r
let y6i = t6i - t41i
let y7r = t33r - t34r
let y7i = t33i - t34i
let y9r = t38r - t37r
let y9i = t38i - t37i
let y10r = t42r - t20r
let y10i = t42i - t20i
let y11r = t36r + t39r
let y11i = t36i + t39i
let y12r = c1 * (t11r - t25r)
let y12i = c1 * (t11i - t25i)
let y13r = t36r - t39r
let y13i = t36i - t39i
let y14r = t42r + t20r
let y14i = t42i + t20i
let y15r = t38r + t37r
let y15i = t38i + t37i
re[p0] = t31r + t32r
im[p0] = t31i + t32i
re[p1] = y1r - y15i
im[p1] = y1i + y15r
re[p2] = y2r - y14i
im[p2] = y2i + y14r
re[p3] = y3r - y13i
im[p3] = y3i + y13r
re[p4] = y4r - y12i
im[p4] = y4i + y12r
re[p5] = y5r - y11i
im[p5] = y5i + y11r
re[p6] = y6r - y10i
im[p6] = y6i + y10r
re[p7] = y7r - y9i
im[p7] = y7i + y9r
re[p8] = t31r - t32r
im[p8] = t31i - t32i
re[p9] = y7r + y9i
im[p9] = y7i - y9r
re[p10] = y6r + y10i
im[p10] = y6i - y10r
re[p11] = y5r + y11i
im[p11] = y5i - y11r
re[p12] = y4r + y12i
im[p12] = y4i - y12r
re[p13] = y3r + y13i
im[p13] = y3i - y13r
re[p14] = y2r + y14i
im[p14] = y2i - y14r
re[p15] = y1r + y15i
im[p15] = y1i - y15r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
if p13 < limit {
p13 = p13 + mr
}
p13 = p13 + delta
if p14 < limit {
p14 = p14 + mr
}
p14 = p14 + delta
if p15 < limit {
p15 = p15 + mr
}
p15 = p15 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 16 stage of the prime factor
/// transform, for the twist 5.
///
/// This is the small transform of the original, `Pfacc.pfa16`,
/// with the twist 5. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r16_mu5(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 16
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 16)
let mut p1 = m * (1 * kfac % 16)
let mut p2 = m * (2 * kfac % 16)
let mut p3 = m * (3 * kfac % 16)
let mut p4 = m * (4 * kfac % 16)
let mut p5 = m * (5 * kfac % 16)
let mut p6 = m * (6 * kfac % 16)
let mut p7 = m * (7 * kfac % 16)
let mut p8 = m * (8 * kfac % 16)
let mut p9 = m * (9 * kfac % 16)
let mut p10 = m * (10 * kfac % 16)
let mut p11 = m * (11 * kfac % 16)
let mut p12 = m * (12 * kfac % 16)
let mut p13 = m * (13 * kfac % 16)
let mut p14 = m * (14 * kfac % 16)
let mut p15 = m * (15 * kfac % 16)
let c1 = 1.0
let c2 = -0.3826834323650876
let c3 = 0.9238795325112876
let c4 = -0.7071067811865474
let c5 = -0.7071067811865474
let c6 = 0.9238795325112876
let c7 = -0.3826834323650876
let mut i = 0
while i < m {
let t1r = re[p0] + re[p8]
let t1i = im[p0] + im[p8]
let t2r = re[p4] + re[p12]
let t2i = im[p4] + im[p12]
let t3r = re[p0] - re[p8]
let t3i = im[p0] - im[p8]
let t4r = c1 * (re[p4] - re[p12])
let t4i = c1 * (im[p4] - im[p12])
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = t1r - t2r
let t6i = t1i - t2i
let t7r = re[p1] + re[p9]
let t7i = im[p1] + im[p9]
let t8r = re[p5] + re[p13]
let t8i = im[p5] + im[p13]
let t9r = re[p1] - re[p9]
let t9i = im[p1] - im[p9]
let t10r = re[p5] - re[p13]
let t10i = im[p5] - im[p13]
let t11r = t7r + t8r
let t11i = t7i + t8i
let t12r = t7r - t8r
let t12i = t7i - t8i
let t13r = re[p2] + re[p10]
let t13i = im[p2] + im[p10]
let t14r = re[p6] + re[p14]
let t14i = im[p6] + im[p14]
let t15r = re[p2] - re[p10]
let t15i = im[p2] - im[p10]
let t16r = re[p6] - re[p14]
let t16i = im[p6] - im[p14]
let t17r = t13r + t14r
let t17i = t13i + t14i
let t18r = c4 * (t15r - t16r)
let t18i = c4 * (t15i - t16i)
let t19r = c5 * (t15r + t16r)
let t19i = c5 * (t15i + t16i)
let t20r = c1 * (t13r - t14r)
let t20i = c1 * (t13i - t14i)
let t21r = re[p3] + re[p11]
let t21i = im[p3] + im[p11]
let t22r = re[p7] + re[p15]
let t22i = im[p7] + im[p15]
let t23r = re[p3] - re[p11]
let t23i = im[p3] - im[p11]
let t24r = re[p7] - re[p15]
let t24i = im[p7] - im[p15]
let t25r = t21r + t22r
let t25i = t21i + t22i
let t26r = t21r - t22r
let t26i = t21i - t22i
let t27r = t9r + t24r
let t27i = t9i + t24i
let t28r = t10r + t23r
let t28i = t10i + t23i
let t29r = t9r - t24r
let t29i = t9i - t24i
let t30r = t10r - t23r
let t30i = t10i - t23i
let t31r = t5r + t17r
let t31i = t5i + t17i
let t32r = t11r + t25r
let t32i = t11i + t25i
let t33r = t3r + t18r
let t33i = t3i + t18i
let t34r = c2 * t29r - c6 * t30r
let t34i = c2 * t29i - c6 * t30i
let t35r = t3r - t18r
let t35i = t3i - t18i
let t36r = c7 * t27r - c3 * t28r
let t36i = c7 * t27i - c3 * t28i
let t37r = t4r + t19r
let t37i = t4i + t19i
let t38r = c3 * t27r + c7 * t28r
let t38i = c3 * t27i + c7 * t28i
let t39r = t4r - t19r
let t39i = t4i - t19i
let t40r = c6 * t29r + c2 * t30r
let t40i = c6 * t29i + c2 * t30i
let t41r = c4 * (t12r - t26r)
let t41i = c4 * (t12i - t26i)
let t42r = c5 * (t12r + t26r)
let t42i = c5 * (t12i + t26i)
let y1r = t33r + t34r
let y1i = t33i + t34i
let y2r = t6r + t41r
let y2i = t6i + t41i
let y3r = t35r + t40r
let y3i = t35i + t40i
let y4r = t5r - t17r
let y4i = t5i - t17i
let y5r = t35r - t40r
let y5i = t35i - t40i
let y6r = t6r - t41r
let y6i = t6i - t41i
let y7r = t33r - t34r
let y7i = t33i - t34i
let y9r = t38r - t37r
let y9i = t38i - t37i
let y10r = t42r - t20r
let y10i = t42i - t20i
let y11r = t36r + t39r
let y11i = t36i + t39i
let y12r = c1 * (t11r - t25r)
let y12i = c1 * (t11i - t25i)
let y13r = t36r - t39r
let y13i = t36i - t39i
let y14r = t42r + t20r
let y14i = t42i + t20i
let y15r = t38r + t37r
let y15i = t38i + t37i
re[p0] = t31r + t32r
im[p0] = t31i + t32i
re[p1] = y1r - y15i
im[p1] = y1i + y15r
re[p2] = y2r - y14i
im[p2] = y2i + y14r
re[p3] = y3r - y13i
im[p3] = y3i + y13r
re[p4] = y4r - y12i
im[p4] = y4i + y12r
re[p5] = y5r - y11i
im[p5] = y5i + y11r
re[p6] = y6r - y10i
im[p6] = y6i + y10r
re[p7] = y7r - y9i
im[p7] = y7i + y9r
re[p8] = t31r - t32r
im[p8] = t31i - t32i
re[p9] = y7r + y9i
im[p9] = y7i - y9r
re[p10] = y6r + y10i
im[p10] = y6i - y10r
re[p11] = y5r + y11i
im[p11] = y5i - y11r
re[p12] = y4r + y12i
im[p12] = y4i - y12r
re[p13] = y3r + y13i
im[p13] = y3i - y13r
re[p14] = y2r + y14i
im[p14] = y2i - y14r
re[p15] = y1r + y15i
im[p15] = y1i - y15r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
if p13 < limit {
p13 = p13 + mr
}
p13 = p13 + delta
if p14 < limit {
p14 = p14 + mr
}
p14 = p14 + delta
if p15 < limit {
p15 = p15 + mr
}
p15 = p15 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 16 stage of the prime factor
/// transform, for the twist 7.
///
/// This is the small transform of the original, `Pfacc.pfa16`,
/// with the twist 7. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r16_mu7(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 16
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 16)
let mut p1 = m * (1 * kfac % 16)
let mut p2 = m * (2 * kfac % 16)
let mut p3 = m * (3 * kfac % 16)
let mut p4 = m * (4 * kfac % 16)
let mut p5 = m * (5 * kfac % 16)
let mut p6 = m * (6 * kfac % 16)
let mut p7 = m * (7 * kfac % 16)
let mut p8 = m * (8 * kfac % 16)
let mut p9 = m * (9 * kfac % 16)
let mut p10 = m * (10 * kfac % 16)
let mut p11 = m * (11 * kfac % 16)
let mut p12 = m * (12 * kfac % 16)
let mut p13 = m * (13 * kfac % 16)
let mut p14 = m * (14 * kfac % 16)
let mut p15 = m * (15 * kfac % 16)
let c1 = -1.0
let c2 = -0.9238795325112852
let c3 = 0.3826834323650934
let c4 = 0.707106781186546
let c5 = -0.707106781186546
let c6 = -0.3826834323650934
let c7 = 0.9238795325112852
let mut i = 0
while i < m {
let t1r = re[p0] + re[p8]
let t1i = im[p0] + im[p8]
let t2r = re[p4] + re[p12]
let t2i = im[p4] + im[p12]
let t3r = re[p0] - re[p8]
let t3i = im[p0] - im[p8]
let t4r = c1 * (re[p4] - re[p12])
let t4i = c1 * (im[p4] - im[p12])
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = t1r - t2r
let t6i = t1i - t2i
let t7r = re[p1] + re[p9]
let t7i = im[p1] + im[p9]
let t8r = re[p5] + re[p13]
let t8i = im[p5] + im[p13]
let t9r = re[p1] - re[p9]
let t9i = im[p1] - im[p9]
let t10r = re[p5] - re[p13]
let t10i = im[p5] - im[p13]
let t11r = t7r + t8r
let t11i = t7i + t8i
let t12r = t7r - t8r
let t12i = t7i - t8i
let t13r = re[p2] + re[p10]
let t13i = im[p2] + im[p10]
let t14r = re[p6] + re[p14]
let t14i = im[p6] + im[p14]
let t15r = re[p2] - re[p10]
let t15i = im[p2] - im[p10]
let t16r = re[p6] - re[p14]
let t16i = im[p6] - im[p14]
let t17r = t13r + t14r
let t17i = t13i + t14i
let t18r = c4 * (t15r - t16r)
let t18i = c4 * (t15i - t16i)
let t19r = c5 * (t15r + t16r)
let t19i = c5 * (t15i + t16i)
let t20r = c1 * (t13r - t14r)
let t20i = c1 * (t13i - t14i)
let t21r = re[p3] + re[p11]
let t21i = im[p3] + im[p11]
let t22r = re[p7] + re[p15]
let t22i = im[p7] + im[p15]
let t23r = re[p3] - re[p11]
let t23i = im[p3] - im[p11]
let t24r = re[p7] - re[p15]
let t24i = im[p7] - im[p15]
let t25r = t21r + t22r
let t25i = t21i + t22i
let t26r = t21r - t22r
let t26i = t21i - t22i
let t27r = t9r + t24r
let t27i = t9i + t24i
let t28r = t10r + t23r
let t28i = t10i + t23i
let t29r = t9r - t24r
let t29i = t9i - t24i
let t30r = t10r - t23r
let t30i = t10i - t23i
let t31r = t5r + t17r
let t31i = t5i + t17i
let t32r = t11r + t25r
let t32i = t11i + t25i
let t33r = t3r + t18r
let t33i = t3i + t18i
let t34r = c2 * t29r - c6 * t30r
let t34i = c2 * t29i - c6 * t30i
let t35r = t3r - t18r
let t35i = t3i - t18i
let t36r = c7 * t27r - c3 * t28r
let t36i = c7 * t27i - c3 * t28i
let t37r = t4r + t19r
let t37i = t4i + t19i
let t38r = c3 * t27r + c7 * t28r
let t38i = c3 * t27i + c7 * t28i
let t39r = t4r - t19r
let t39i = t4i - t19i
let t40r = c6 * t29r + c2 * t30r
let t40i = c6 * t29i + c2 * t30i
let t41r = c4 * (t12r - t26r)
let t41i = c4 * (t12i - t26i)
let t42r = c5 * (t12r + t26r)
let t42i = c5 * (t12i + t26i)
let y1r = t33r + t34r
let y1i = t33i + t34i
let y2r = t6r + t41r
let y2i = t6i + t41i
let y3r = t35r + t40r
let y3i = t35i + t40i
let y4r = t5r - t17r
let y4i = t5i - t17i
let y5r = t35r - t40r
let y5i = t35i - t40i
let y6r = t6r - t41r
let y6i = t6i - t41i
let y7r = t33r - t34r
let y7i = t33i - t34i
let y9r = t38r - t37r
let y9i = t38i - t37i
let y10r = t42r - t20r
let y10i = t42i - t20i
let y11r = t36r + t39r
let y11i = t36i + t39i
let y12r = c1 * (t11r - t25r)
let y12i = c1 * (t11i - t25i)
let y13r = t36r - t39r
let y13i = t36i - t39i
let y14r = t42r + t20r
let y14i = t42i + t20i
let y15r = t38r + t37r
let y15i = t38i + t37i
re[p0] = t31r + t32r
im[p0] = t31i + t32i
re[p1] = y1r - y15i
im[p1] = y1i + y15r
re[p2] = y2r - y14i
im[p2] = y2i + y14r
re[p3] = y3r - y13i
im[p3] = y3i + y13r
re[p4] = y4r - y12i
im[p4] = y4i + y12r
re[p5] = y5r - y11i
im[p5] = y5i + y11r
re[p6] = y6r - y10i
im[p6] = y6i + y10r
re[p7] = y7r - y9i
im[p7] = y7i + y9r
re[p8] = t31r - t32r
im[p8] = t31i - t32i
re[p9] = y7r + y9i
im[p9] = y7i - y9r
re[p10] = y6r + y10i
im[p10] = y6i - y10r
re[p11] = y5r + y11i
im[p11] = y5i - y11r
re[p12] = y4r + y12i
im[p12] = y4i - y12r
re[p13] = y3r + y13i
im[p13] = y3i - y13r
re[p14] = y2r + y14i
im[p14] = y2i - y14r
re[p15] = y1r + y15i
im[p15] = y1i - y15r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
if p13 < limit {
p13 = p13 + mr
}
p13 = p13 + delta
if p14 < limit {
p14 = p14 + mr
}
p14 = p14 + delta
if p15 < limit {
p15 = p15 + mr
}
p15 = p15 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 16 stage of the prime factor
/// transform, for the twist 9.
///
/// This is the small transform of the original, `Pfacc.pfa16`,
/// with the twist 9. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r16_mu9(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 16
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 16)
let mut p1 = m * (1 * kfac % 16)
let mut p2 = m * (2 * kfac % 16)
let mut p3 = m * (3 * kfac % 16)
let mut p4 = m * (4 * kfac % 16)
let mut p5 = m * (5 * kfac % 16)
let mut p6 = m * (6 * kfac % 16)
let mut p7 = m * (7 * kfac % 16)
let mut p8 = m * (8 * kfac % 16)
let mut p9 = m * (9 * kfac % 16)
let mut p10 = m * (10 * kfac % 16)
let mut p11 = m * (11 * kfac % 16)
let mut p12 = m * (12 * kfac % 16)
let mut p13 = m * (13 * kfac % 16)
let mut p14 = m * (14 * kfac % 16)
let mut p15 = m * (15 * kfac % 16)
let c1 = 1.0
let c2 = -0.9238795325112872
let c3 = -0.3826834323650891
let c4 = 0.7071067811865471
let c5 = 0.7071067811865471
let c6 = -0.3826834323650891
let c7 = -0.9238795325112872
let mut i = 0
while i < m {
let t1r = re[p0] + re[p8]
let t1i = im[p0] + im[p8]
let t2r = re[p4] + re[p12]
let t2i = im[p4] + im[p12]
let t3r = re[p0] - re[p8]
let t3i = im[p0] - im[p8]
let t4r = c1 * (re[p4] - re[p12])
let t4i = c1 * (im[p4] - im[p12])
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = t1r - t2r
let t6i = t1i - t2i
let t7r = re[p1] + re[p9]
let t7i = im[p1] + im[p9]
let t8r = re[p5] + re[p13]
let t8i = im[p5] + im[p13]
let t9r = re[p1] - re[p9]
let t9i = im[p1] - im[p9]
let t10r = re[p5] - re[p13]
let t10i = im[p5] - im[p13]
let t11r = t7r + t8r
let t11i = t7i + t8i
let t12r = t7r - t8r
let t12i = t7i - t8i
let t13r = re[p2] + re[p10]
let t13i = im[p2] + im[p10]
let t14r = re[p6] + re[p14]
let t14i = im[p6] + im[p14]
let t15r = re[p2] - re[p10]
let t15i = im[p2] - im[p10]
let t16r = re[p6] - re[p14]
let t16i = im[p6] - im[p14]
let t17r = t13r + t14r
let t17i = t13i + t14i
let t18r = c4 * (t15r - t16r)
let t18i = c4 * (t15i - t16i)
let t19r = c5 * (t15r + t16r)
let t19i = c5 * (t15i + t16i)
let t20r = c1 * (t13r - t14r)
let t20i = c1 * (t13i - t14i)
let t21r = re[p3] + re[p11]
let t21i = im[p3] + im[p11]
let t22r = re[p7] + re[p15]
let t22i = im[p7] + im[p15]
let t23r = re[p3] - re[p11]
let t23i = im[p3] - im[p11]
let t24r = re[p7] - re[p15]
let t24i = im[p7] - im[p15]
let t25r = t21r + t22r
let t25i = t21i + t22i
let t26r = t21r - t22r
let t26i = t21i - t22i
let t27r = t9r + t24r
let t27i = t9i + t24i
let t28r = t10r + t23r
let t28i = t10i + t23i
let t29r = t9r - t24r
let t29i = t9i - t24i
let t30r = t10r - t23r
let t30i = t10i - t23i
let t31r = t5r + t17r
let t31i = t5i + t17i
let t32r = t11r + t25r
let t32i = t11i + t25i
let t33r = t3r + t18r
let t33i = t3i + t18i
let t34r = c2 * t29r - c6 * t30r
let t34i = c2 * t29i - c6 * t30i
let t35r = t3r - t18r
let t35i = t3i - t18i
let t36r = c7 * t27r - c3 * t28r
let t36i = c7 * t27i - c3 * t28i
let t37r = t4r + t19r
let t37i = t4i + t19i
let t38r = c3 * t27r + c7 * t28r
let t38i = c3 * t27i + c7 * t28i
let t39r = t4r - t19r
let t39i = t4i - t19i
let t40r = c6 * t29r + c2 * t30r
let t40i = c6 * t29i + c2 * t30i
let t41r = c4 * (t12r - t26r)
let t41i = c4 * (t12i - t26i)
let t42r = c5 * (t12r + t26r)
let t42i = c5 * (t12i + t26i)
let y1r = t33r + t34r
let y1i = t33i + t34i
let y2r = t6r + t41r
let y2i = t6i + t41i
let y3r = t35r + t40r
let y3i = t35i + t40i
let y4r = t5r - t17r
let y4i = t5i - t17i
let y5r = t35r - t40r
let y5i = t35i - t40i
let y6r = t6r - t41r
let y6i = t6i - t41i
let y7r = t33r - t34r
let y7i = t33i - t34i
let y9r = t38r - t37r
let y9i = t38i - t37i
let y10r = t42r - t20r
let y10i = t42i - t20i
let y11r = t36r + t39r
let y11i = t36i + t39i
let y12r = c1 * (t11r - t25r)
let y12i = c1 * (t11i - t25i)
let y13r = t36r - t39r
let y13i = t36i - t39i
let y14r = t42r + t20r
let y14i = t42i + t20i
let y15r = t38r + t37r
let y15i = t38i + t37i
re[p0] = t31r + t32r
im[p0] = t31i + t32i
re[p1] = y1r - y15i
im[p1] = y1i + y15r
re[p2] = y2r - y14i
im[p2] = y2i + y14r
re[p3] = y3r - y13i
im[p3] = y3i + y13r
re[p4] = y4r - y12i
im[p4] = y4i + y12r
re[p5] = y5r - y11i
im[p5] = y5i + y11r
re[p6] = y6r - y10i
im[p6] = y6i + y10r
re[p7] = y7r - y9i
im[p7] = y7i + y9r
re[p8] = t31r - t32r
im[p8] = t31i - t32i
re[p9] = y7r + y9i
im[p9] = y7i - y9r
re[p10] = y6r + y10i
im[p10] = y6i - y10r
re[p11] = y5r + y11i
im[p11] = y5i - y11r
re[p12] = y4r + y12i
im[p12] = y4i - y12r
re[p13] = y3r + y13i
im[p13] = y3i - y13r
re[p14] = y2r + y14i
im[p14] = y2i - y14r
re[p15] = y1r + y15i
im[p15] = y1i - y15r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
if p13 < limit {
p13 = p13 + mr
}
p13 = p13 + delta
if p14 < limit {
p14 = p14 + mr
}
p14 = p14 + delta
if p15 < limit {
p15 = p15 + mr
}
p15 = p15 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 16 stage of the prime factor
/// transform, for the twist 11.
///
/// This is the small transform of the original, `Pfacc.pfa16`,
/// with the twist 11. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r16_mu11(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 16
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 16)
let mut p1 = m * (1 * kfac % 16)
let mut p2 = m * (2 * kfac % 16)
let mut p3 = m * (3 * kfac % 16)
let mut p4 = m * (4 * kfac % 16)
let mut p5 = m * (5 * kfac % 16)
let mut p6 = m * (6 * kfac % 16)
let mut p7 = m * (7 * kfac % 16)
let mut p8 = m * (8 * kfac % 16)
let mut p9 = m * (9 * kfac % 16)
let mut p10 = m * (10 * kfac % 16)
let mut p11 = m * (11 * kfac % 16)
let mut p12 = m * (12 * kfac % 16)
let mut p13 = m * (13 * kfac % 16)
let mut p14 = m * (14 * kfac % 16)
let mut p15 = m * (15 * kfac % 16)
let c1 = -1.0
let c2 = -0.3826834323650927
let c3 = -0.9238795325112856
let c4 = -0.7071067811865465
let c5 = 0.7071067811865465
let c6 = 0.9238795325112856
let c7 = 0.3826834323650927
let mut i = 0
while i < m {
let t1r = re[p0] + re[p8]
let t1i = im[p0] + im[p8]
let t2r = re[p4] + re[p12]
let t2i = im[p4] + im[p12]
let t3r = re[p0] - re[p8]
let t3i = im[p0] - im[p8]
let t4r = c1 * (re[p4] - re[p12])
let t4i = c1 * (im[p4] - im[p12])
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = t1r - t2r
let t6i = t1i - t2i
let t7r = re[p1] + re[p9]
let t7i = im[p1] + im[p9]
let t8r = re[p5] + re[p13]
let t8i = im[p5] + im[p13]
let t9r = re[p1] - re[p9]
let t9i = im[p1] - im[p9]
let t10r = re[p5] - re[p13]
let t10i = im[p5] - im[p13]
let t11r = t7r + t8r
let t11i = t7i + t8i
let t12r = t7r - t8r
let t12i = t7i - t8i
let t13r = re[p2] + re[p10]
let t13i = im[p2] + im[p10]
let t14r = re[p6] + re[p14]
let t14i = im[p6] + im[p14]
let t15r = re[p2] - re[p10]
let t15i = im[p2] - im[p10]
let t16r = re[p6] - re[p14]
let t16i = im[p6] - im[p14]
let t17r = t13r + t14r
let t17i = t13i + t14i
let t18r = c4 * (t15r - t16r)
let t18i = c4 * (t15i - t16i)
let t19r = c5 * (t15r + t16r)
let t19i = c5 * (t15i + t16i)
let t20r = c1 * (t13r - t14r)
let t20i = c1 * (t13i - t14i)
let t21r = re[p3] + re[p11]
let t21i = im[p3] + im[p11]
let t22r = re[p7] + re[p15]
let t22i = im[p7] + im[p15]
let t23r = re[p3] - re[p11]
let t23i = im[p3] - im[p11]
let t24r = re[p7] - re[p15]
let t24i = im[p7] - im[p15]
let t25r = t21r + t22r
let t25i = t21i + t22i
let t26r = t21r - t22r
let t26i = t21i - t22i
let t27r = t9r + t24r
let t27i = t9i + t24i
let t28r = t10r + t23r
let t28i = t10i + t23i
let t29r = t9r - t24r
let t29i = t9i - t24i
let t30r = t10r - t23r
let t30i = t10i - t23i
let t31r = t5r + t17r
let t31i = t5i + t17i
let t32r = t11r + t25r
let t32i = t11i + t25i
let t33r = t3r + t18r
let t33i = t3i + t18i
let t34r = c2 * t29r - c6 * t30r
let t34i = c2 * t29i - c6 * t30i
let t35r = t3r - t18r
let t35i = t3i - t18i
let t36r = c7 * t27r - c3 * t28r
let t36i = c7 * t27i - c3 * t28i
let t37r = t4r + t19r
let t37i = t4i + t19i
let t38r = c3 * t27r + c7 * t28r
let t38i = c3 * t27i + c7 * t28i
let t39r = t4r - t19r
let t39i = t4i - t19i
let t40r = c6 * t29r + c2 * t30r
let t40i = c6 * t29i + c2 * t30i
let t41r = c4 * (t12r - t26r)
let t41i = c4 * (t12i - t26i)
let t42r = c5 * (t12r + t26r)
let t42i = c5 * (t12i + t26i)
let y1r = t33r + t34r
let y1i = t33i + t34i
let y2r = t6r + t41r
let y2i = t6i + t41i
let y3r = t35r + t40r
let y3i = t35i + t40i
let y4r = t5r - t17r
let y4i = t5i - t17i
let y5r = t35r - t40r
let y5i = t35i - t40i
let y6r = t6r - t41r
let y6i = t6i - t41i
let y7r = t33r - t34r
let y7i = t33i - t34i
let y9r = t38r - t37r
let y9i = t38i - t37i
let y10r = t42r - t20r
let y10i = t42i - t20i
let y11r = t36r + t39r
let y11i = t36i + t39i
let y12r = c1 * (t11r - t25r)
let y12i = c1 * (t11i - t25i)
let y13r = t36r - t39r
let y13i = t36i - t39i
let y14r = t42r + t20r
let y14i = t42i + t20i
let y15r = t38r + t37r
let y15i = t38i + t37i
re[p0] = t31r + t32r
im[p0] = t31i + t32i
re[p1] = y1r - y15i
im[p1] = y1i + y15r
re[p2] = y2r - y14i
im[p2] = y2i + y14r
re[p3] = y3r - y13i
im[p3] = y3i + y13r
re[p4] = y4r - y12i
im[p4] = y4i + y12r
re[p5] = y5r - y11i
im[p5] = y5i + y11r
re[p6] = y6r - y10i
im[p6] = y6i + y10r
re[p7] = y7r - y9i
im[p7] = y7i + y9r
re[p8] = t31r - t32r
im[p8] = t31i - t32i
re[p9] = y7r + y9i
im[p9] = y7i - y9r
re[p10] = y6r + y10i
im[p10] = y6i - y10r
re[p11] = y5r + y11i
im[p11] = y5i - y11r
re[p12] = y4r + y12i
im[p12] = y4i - y12r
re[p13] = y3r + y13i
im[p13] = y3i - y13r
re[p14] = y2r + y14i
im[p14] = y2i - y14r
re[p15] = y1r + y15i
im[p15] = y1i - y15r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
if p13 < limit {
p13 = p13 + mr
}
p13 = p13 + delta
if p14 < limit {
p14 = p14 + mr
}
p14 = p14 + delta
if p15 < limit {
p15 = p15 + mr
}
p15 = p15 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 16 stage of the prime factor
/// transform, for the twist 13.
///
/// This is the small transform of the original, `Pfacc.pfa16`,
/// with the twist 13. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r16_mu13(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 16
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 16)
let mut p1 = m * (1 * kfac % 16)
let mut p2 = m * (2 * kfac % 16)
let mut p3 = m * (3 * kfac % 16)
let mut p4 = m * (4 * kfac % 16)
let mut p5 = m * (5 * kfac % 16)
let mut p6 = m * (6 * kfac % 16)
let mut p7 = m * (7 * kfac % 16)
let mut p8 = m * (8 * kfac % 16)
let mut p9 = m * (9 * kfac % 16)
let mut p10 = m * (10 * kfac % 16)
let mut p11 = m * (11 * kfac % 16)
let mut p12 = m * (12 * kfac % 16)
let mut p13 = m * (13 * kfac % 16)
let mut p14 = m * (14 * kfac % 16)
let mut p15 = m * (15 * kfac % 16)
let c1 = 1.0
let c2 = 0.382683432365091
let c3 = -0.9238795325112862
let c4 = -0.7071067811865432
let c5 = -0.7071067811865432
let c6 = -0.9238795325112862
let c7 = 0.382683432365091
let mut i = 0
while i < m {
let t1r = re[p0] + re[p8]
let t1i = im[p0] + im[p8]
let t2r = re[p4] + re[p12]
let t2i = im[p4] + im[p12]
let t3r = re[p0] - re[p8]
let t3i = im[p0] - im[p8]
let t4r = c1 * (re[p4] - re[p12])
let t4i = c1 * (im[p4] - im[p12])
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = t1r - t2r
let t6i = t1i - t2i
let t7r = re[p1] + re[p9]
let t7i = im[p1] + im[p9]
let t8r = re[p5] + re[p13]
let t8i = im[p5] + im[p13]
let t9r = re[p1] - re[p9]
let t9i = im[p1] - im[p9]
let t10r = re[p5] - re[p13]
let t10i = im[p5] - im[p13]
let t11r = t7r + t8r
let t11i = t7i + t8i
let t12r = t7r - t8r
let t12i = t7i - t8i
let t13r = re[p2] + re[p10]
let t13i = im[p2] + im[p10]
let t14r = re[p6] + re[p14]
let t14i = im[p6] + im[p14]
let t15r = re[p2] - re[p10]
let t15i = im[p2] - im[p10]
let t16r = re[p6] - re[p14]
let t16i = im[p6] - im[p14]
let t17r = t13r + t14r
let t17i = t13i + t14i
let t18r = c4 * (t15r - t16r)
let t18i = c4 * (t15i - t16i)
let t19r = c5 * (t15r + t16r)
let t19i = c5 * (t15i + t16i)
let t20r = c1 * (t13r - t14r)
let t20i = c1 * (t13i - t14i)
let t21r = re[p3] + re[p11]
let t21i = im[p3] + im[p11]
let t22r = re[p7] + re[p15]
let t22i = im[p7] + im[p15]
let t23r = re[p3] - re[p11]
let t23i = im[p3] - im[p11]
let t24r = re[p7] - re[p15]
let t24i = im[p7] - im[p15]
let t25r = t21r + t22r
let t25i = t21i + t22i
let t26r = t21r - t22r
let t26i = t21i - t22i
let t27r = t9r + t24r
let t27i = t9i + t24i
let t28r = t10r + t23r
let t28i = t10i + t23i
let t29r = t9r - t24r
let t29i = t9i - t24i
let t30r = t10r - t23r
let t30i = t10i - t23i
let t31r = t5r + t17r
let t31i = t5i + t17i
let t32r = t11r + t25r
let t32i = t11i + t25i
let t33r = t3r + t18r
let t33i = t3i + t18i
let t34r = c2 * t29r - c6 * t30r
let t34i = c2 * t29i - c6 * t30i
let t35r = t3r - t18r
let t35i = t3i - t18i
let t36r = c7 * t27r - c3 * t28r
let t36i = c7 * t27i - c3 * t28i
let t37r = t4r + t19r
let t37i = t4i + t19i
let t38r = c3 * t27r + c7 * t28r
let t38i = c3 * t27i + c7 * t28i
let t39r = t4r - t19r
let t39i = t4i - t19i
let t40r = c6 * t29r + c2 * t30r
let t40i = c6 * t29i + c2 * t30i
let t41r = c4 * (t12r - t26r)
let t41i = c4 * (t12i - t26i)
let t42r = c5 * (t12r + t26r)
let t42i = c5 * (t12i + t26i)
let y1r = t33r + t34r
let y1i = t33i + t34i
let y2r = t6r + t41r
let y2i = t6i + t41i
let y3r = t35r + t40r
let y3i = t35i + t40i
let y4r = t5r - t17r
let y4i = t5i - t17i
let y5r = t35r - t40r
let y5i = t35i - t40i
let y6r = t6r - t41r
let y6i = t6i - t41i
let y7r = t33r - t34r
let y7i = t33i - t34i
let y9r = t38r - t37r
let y9i = t38i - t37i
let y10r = t42r - t20r
let y10i = t42i - t20i
let y11r = t36r + t39r
let y11i = t36i + t39i
let y12r = c1 * (t11r - t25r)
let y12i = c1 * (t11i - t25i)
let y13r = t36r - t39r
let y13i = t36i - t39i
let y14r = t42r + t20r
let y14i = t42i + t20i
let y15r = t38r + t37r
let y15i = t38i + t37i
re[p0] = t31r + t32r
im[p0] = t31i + t32i
re[p1] = y1r - y15i
im[p1] = y1i + y15r
re[p2] = y2r - y14i
im[p2] = y2i + y14r
re[p3] = y3r - y13i
im[p3] = y3i + y13r
re[p4] = y4r - y12i
im[p4] = y4i + y12r
re[p5] = y5r - y11i
im[p5] = y5i + y11r
re[p6] = y6r - y10i
im[p6] = y6i + y10r
re[p7] = y7r - y9i
im[p7] = y7i + y9r
re[p8] = t31r - t32r
im[p8] = t31i - t32i
re[p9] = y7r + y9i
im[p9] = y7i - y9r
re[p10] = y6r + y10i
im[p10] = y6i - y10r
re[p11] = y5r + y11i
im[p11] = y5i - y11r
re[p12] = y4r + y12i
im[p12] = y4i - y12r
re[p13] = y3r + y13i
im[p13] = y3i - y13r
re[p14] = y2r + y14i
im[p14] = y2i - y14r
re[p15] = y1r + y15i
im[p15] = y1i - y15r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
if p13 < limit {
p13 = p13 + mr
}
p13 = p13 + delta
if p14 < limit {
p14 = p14 + mr
}
p14 = p14 + delta
if p15 < limit {
p15 = p15 + mr
}
p15 = p15 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// The butterfly of the radix 16 stage of the prime factor
/// transform, for the twist 15.
///
/// This is the small transform of the original, `Pfacc.pfa16`,
/// with the twist 15. Its constants are solved in double
/// precision, see `tools/solve_constants.py`.
///|
fn stage_r16_mu15(
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
let mr = m * 16
let delta = 1 - m * kfac
let mut limit = m * kfac
let mut p0 = m * (0 * kfac % 16)
let mut p1 = m * (1 * kfac % 16)
let mut p2 = m * (2 * kfac % 16)
let mut p3 = m * (3 * kfac % 16)
let mut p4 = m * (4 * kfac % 16)
let mut p5 = m * (5 * kfac % 16)
let mut p6 = m * (6 * kfac % 16)
let mut p7 = m * (7 * kfac % 16)
let mut p8 = m * (8 * kfac % 16)
let mut p9 = m * (9 * kfac % 16)
let mut p10 = m * (10 * kfac % 16)
let mut p11 = m * (11 * kfac % 16)
let mut p12 = m * (12 * kfac % 16)
let mut p13 = m * (13 * kfac % 16)
let mut p14 = m * (14 * kfac % 16)
let mut p15 = m * (15 * kfac % 16)
let c1 = -1.0
let c2 = 0.9238795325112883
let c3 = -0.3826834323650863
let c4 = 0.7071067811865476
let c5 = -0.7071067811865476
let c6 = 0.3826834323650863
let c7 = -0.9238795325112883
let mut i = 0
while i < m {
let t1r = re[p0] + re[p8]
let t1i = im[p0] + im[p8]
let t2r = re[p4] + re[p12]
let t2i = im[p4] + im[p12]
let t3r = re[p0] - re[p8]
let t3i = im[p0] - im[p8]
let t4r = c1 * (re[p4] - re[p12])
let t4i = c1 * (im[p4] - im[p12])
let t5r = t1r + t2r
let t5i = t1i + t2i
let t6r = t1r - t2r
let t6i = t1i - t2i
let t7r = re[p1] + re[p9]
let t7i = im[p1] + im[p9]
let t8r = re[p5] + re[p13]
let t8i = im[p5] + im[p13]
let t9r = re[p1] - re[p9]
let t9i = im[p1] - im[p9]
let t10r = re[p5] - re[p13]
let t10i = im[p5] - im[p13]
let t11r = t7r + t8r
let t11i = t7i + t8i
let t12r = t7r - t8r
let t12i = t7i - t8i
let t13r = re[p2] + re[p10]
let t13i = im[p2] + im[p10]
let t14r = re[p6] + re[p14]
let t14i = im[p6] + im[p14]
let t15r = re[p2] - re[p10]
let t15i = im[p2] - im[p10]
let t16r = re[p6] - re[p14]
let t16i = im[p6] - im[p14]
let t17r = t13r + t14r
let t17i = t13i + t14i
let t18r = c4 * (t15r - t16r)
let t18i = c4 * (t15i - t16i)
let t19r = c5 * (t15r + t16r)
let t19i = c5 * (t15i + t16i)
let t20r = c1 * (t13r - t14r)
let t20i = c1 * (t13i - t14i)
let t21r = re[p3] + re[p11]
let t21i = im[p3] + im[p11]
let t22r = re[p7] + re[p15]
let t22i = im[p7] + im[p15]
let t23r = re[p3] - re[p11]
let t23i = im[p3] - im[p11]
let t24r = re[p7] - re[p15]
let t24i = im[p7] - im[p15]
let t25r = t21r + t22r
let t25i = t21i + t22i
let t26r = t21r - t22r
let t26i = t21i - t22i
let t27r = t9r + t24r
let t27i = t9i + t24i
let t28r = t10r + t23r
let t28i = t10i + t23i
let t29r = t9r - t24r
let t29i = t9i - t24i
let t30r = t10r - t23r
let t30i = t10i - t23i
let t31r = t5r + t17r
let t31i = t5i + t17i
let t32r = t11r + t25r
let t32i = t11i + t25i
let t33r = t3r + t18r
let t33i = t3i + t18i
let t34r = c2 * t29r - c6 * t30r
let t34i = c2 * t29i - c6 * t30i
let t35r = t3r - t18r
let t35i = t3i - t18i
let t36r = c7 * t27r - c3 * t28r
let t36i = c7 * t27i - c3 * t28i
let t37r = t4r + t19r
let t37i = t4i + t19i
let t38r = c3 * t27r + c7 * t28r
let t38i = c3 * t27i + c7 * t28i
let t39r = t4r - t19r
let t39i = t4i - t19i
let t40r = c6 * t29r + c2 * t30r
let t40i = c6 * t29i + c2 * t30i
let t41r = c4 * (t12r - t26r)
let t41i = c4 * (t12i - t26i)
let t42r = c5 * (t12r + t26r)
let t42i = c5 * (t12i + t26i)
let y1r = t33r + t34r
let y1i = t33i + t34i
let y2r = t6r + t41r
let y2i = t6i + t41i
let y3r = t35r + t40r
let y3i = t35i + t40i
let y4r = t5r - t17r
let y4i = t5i - t17i
let y5r = t35r - t40r
let y5i = t35i - t40i
let y6r = t6r - t41r
let y6i = t6i - t41i
let y7r = t33r - t34r
let y7i = t33i - t34i
let y9r = t38r - t37r
let y9i = t38i - t37i
let y10r = t42r - t20r
let y10i = t42i - t20i
let y11r = t36r + t39r
let y11i = t36i + t39i
let y12r = c1 * (t11r - t25r)
let y12i = c1 * (t11i - t25i)
let y13r = t36r - t39r
let y13i = t36i - t39i
let y14r = t42r + t20r
let y14i = t42i + t20i
let y15r = t38r + t37r
let y15i = t38i + t37i
re[p0] = t31r + t32r
im[p0] = t31i + t32i
re[p1] = y1r - y15i
im[p1] = y1i + y15r
re[p2] = y2r - y14i
im[p2] = y2i + y14r
re[p3] = y3r - y13i
im[p3] = y3i + y13r
re[p4] = y4r - y12i
im[p4] = y4i + y12r
re[p5] = y5r - y11i
im[p5] = y5i + y11r
re[p6] = y6r - y10i
im[p6] = y6i + y10r
re[p7] = y7r - y9i
im[p7] = y7i + y9r
re[p8] = t31r - t32r
im[p8] = t31i - t32i
re[p9] = y7r + y9i
im[p9] = y7i - y9r
re[p10] = y6r + y10i
im[p10] = y6i - y10r
re[p11] = y5r + y11i
im[p11] = y5i - y11r
re[p12] = y4r + y12i
im[p12] = y4i - y12r
re[p13] = y3r + y13i
im[p13] = y3i - y13r
re[p14] = y2r + y14i
im[p14] = y2i - y14r
re[p15] = y1r + y15i
im[p15] = y1i - y15r
if p0 < limit {
p0 = p0 + mr
}
p0 = p0 + delta
if p1 < limit {
p1 = p1 + mr
}
p1 = p1 + delta
if p2 < limit {
p2 = p2 + mr
}
p2 = p2 + delta
if p3 < limit {
p3 = p3 + mr
}
p3 = p3 + delta
if p4 < limit {
p4 = p4 + mr
}
p4 = p4 + delta
if p5 < limit {
p5 = p5 + mr
}
p5 = p5 + delta
if p6 < limit {
p6 = p6 + mr
}
p6 = p6 + delta
if p7 < limit {
p7 = p7 + mr
}
p7 = p7 + delta
if p8 < limit {
p8 = p8 + mr
}
p8 = p8 + delta
if p9 < limit {
p9 = p9 + mr
}
p9 = p9 + delta
if p10 < limit {
p10 = p10 + mr
}
p10 = p10 + delta
if p11 < limit {
p11 = p11 + mr
}
p11 = p11 + delta
if p12 < limit {
p12 = p12 + mr
}
p12 = p12 + delta
if p13 < limit {
p13 = p13 + mr
}
p13 = p13 + delta
if p14 < limit {
p14 = p14 + mr
}
p14 = p14 + delta
if p15 < limit {
p15 = p15 + mr
}
p15 = p15 + delta
limit = limit + 1
i = i + 1
}
}
///|
/// Calls the butterfly of a radix and a twist.
///
/// The twist of the stage is the exponent of the roots of unity
/// of its small transform.
///|
fn stage_dispatch(
r : Int32,
mu : Int32,
m : Int32,
kfac : Int32,
re : Array[Double],
im : Array[Double],
) -> Unit {
if r == 2 {
if mu == 1 {
stage_r2_mu1(m, kfac, re, im)
}
} else if r == 3 {
if mu == 1 {
stage_r3_mu1(m, kfac, re, im)
} else if mu == 2 {
stage_r3_mu2(m, kfac, re, im)
}
} else if r == 4 {
if mu == 1 {
stage_r4_mu1(m, kfac, re, im)
} else if mu == 3 {
stage_r4_mu3(m, kfac, re, im)
}
} else if r == 5 {
if mu == 1 {
stage_r5_mu1(m, kfac, re, im)
} else if mu == 2 {
stage_r5_mu2(m, kfac, re, im)
} else if mu == 3 {
stage_r5_mu3(m, kfac, re, im)
} else if mu == 4 {
stage_r5_mu4(m, kfac, re, im)
}
} else if r == 7 {
if mu == 1 {
stage_r7_mu1(m, kfac, re, im)
} else if mu == 2 {
stage_r7_mu2(m, kfac, re, im)
} else if mu == 3 {
stage_r7_mu3(m, kfac, re, im)
} else if mu == 4 {
stage_r7_mu4(m, kfac, re, im)
} else if mu == 5 {
stage_r7_mu5(m, kfac, re, im)
} else if mu == 6 {
stage_r7_mu6(m, kfac, re, im)
}
} else if r == 8 {
if mu == 1 {
stage_r8_mu1(m, kfac, re, im)
} else if mu == 3 {
stage_r8_mu3(m, kfac, re, im)
} else if mu == 5 {
stage_r8_mu5(m, kfac, re, im)
} else if mu == 7 {
stage_r8_mu7(m, kfac, re, im)
}
} else if r == 9 {
if mu == 1 {
stage_r9_mu1(m, kfac, re, im)
} else if mu == 2 {
stage_r9_mu2(m, kfac, re, im)
} else if mu == 4 {
stage_r9_mu4(m, kfac, re, im)
} else if mu == 5 {
stage_r9_mu5(m, kfac, re, im)
} else if mu == 7 {
stage_r9_mu7(m, kfac, re, im)
} else if mu == 8 {
stage_r9_mu8(m, kfac, re, im)
}
} else if r == 11 {
if mu == 1 {
stage_r11_mu1(m, kfac, re, im)
} else if mu == 2 {
stage_r11_mu2(m, kfac, re, im)
} else if mu == 3 {
stage_r11_mu3(m, kfac, re, im)
} else if mu == 4 {
stage_r11_mu4(m, kfac, re, im)
} else if mu == 5 {
stage_r11_mu5(m, kfac, re, im)
} else if mu == 6 {
stage_r11_mu6(m, kfac, re, im)
} else if mu == 7 {
stage_r11_mu7(m, kfac, re, im)
} else if mu == 8 {
stage_r11_mu8(m, kfac, re, im)
} else if mu == 9 {
stage_r11_mu9(m, kfac, re, im)
} else if mu == 10 {
stage_r11_mu10(m, kfac, re, im)
}
} else if r == 13 {
if mu == 1 {
stage_r13_mu1(m, kfac, re, im)
} else if mu == 2 {
stage_r13_mu2(m, kfac, re, im)
} else if mu == 3 {
stage_r13_mu3(m, kfac, re, im)
} else if mu == 4 {
stage_r13_mu4(m, kfac, re, im)
} else if mu == 5 {
stage_r13_mu5(m, kfac, re, im)
} else if mu == 6 {
stage_r13_mu6(m, kfac, re, im)
} else if mu == 7 {
stage_r13_mu7(m, kfac, re, im)
} else if mu == 8 {
stage_r13_mu8(m, kfac, re, im)
} else if mu == 9 {
stage_r13_mu9(m, kfac, re, im)
} else if mu == 10 {
stage_r13_mu10(m, kfac, re, im)
} else if mu == 11 {
stage_r13_mu11(m, kfac, re, im)
} else if mu == 12 {
stage_r13_mu12(m, kfac, re, im)
}
} else if r == 16 {
if mu == 1 {
stage_r16_mu1(m, kfac, re, im)
} else if mu == 3 {
stage_r16_mu3(m, kfac, re, im)
} else if mu == 5 {
stage_r16_mu5(m, kfac, re, im)
} else if mu == 7 {
stage_r16_mu7(m, kfac, re, im)
} else if mu == 9 {
stage_r16_mu9(m, kfac, re, im)
} else if mu == 11 {
stage_r16_mu11(m, kfac, re, im)
} else if mu == 13 {
stage_r16_mu13(m, kfac, re, im)
} else if mu == 15 {
stage_r16_mu15(m, kfac, re, im)
}
} else {
abort("the transform length has a factor without a butterfly")
}
}