mod g1;
mod g2;
#[cfg(test)]
mod tests;
use ff::Field;
use CurveProjective;
type CoordT<PtT> = <PtT as CurveProjective>::Base;
pub trait IsogenyMap {
fn isogeny_map(&mut self);
}
fn eval_iso<PtT: CurveProjective>(pt: &mut PtT, coeffs: [&[CoordT<PtT>]; 4]) {
let mut tmp = [CoordT::<PtT>::zero(); 16];
let mut mapvals = [CoordT::<PtT>::zero(); 4];
{
let (x, y, z) = pt.as_tuple();
let zpows = {
let mut zpows = [CoordT::<PtT>::zero(); 15];
zpows[0] = *z;
zpows[0].square(); zpows[1] = zpows[0];
zpows[1].square(); {
let (z_squared, rest) = zpows.split_at_mut(1);
for idx in 1..coeffs[2].len() - 2 {
if idx % 2 == 0 {
rest[idx] = rest[idx / 2 - 1];
rest[idx].square();
} else {
rest[idx] = rest[idx - 1];
rest[idx].mul_assign(&z_squared[0]);
}
}
}
zpows
};
for idx in 0..4 {
let clen = coeffs[idx].len() - 1;
for jdx in 0..clen {
tmp[jdx] = coeffs[idx][clen - 1 - jdx];
tmp[jdx].mul_assign(&zpows[jdx]);
}
mapvals[idx] = coeffs[idx][clen];
for tmpval in &tmp[..clen] {
mapvals[idx].mul_assign(x);
mapvals[idx].add_assign(tmpval);
}
}
mapvals[1].mul_assign(&zpows[0]);
mapvals[2].mul_assign(y);
mapvals[3].mul_assign(z);
mapvals[3].mul_assign(&zpows[0]);
}
let (xx, yy, zz) = {
let (xx, rest) = tmp.split_at_mut(1);
let (yy, rest) = rest.split_at_mut(1);
(&mut xx[0], &mut yy[0], &mut rest[0])
};
*zz = mapvals[1];
zz.mul_assign(&mapvals[3]);
*xx = mapvals[0];
xx.mul_assign(&mapvals[3]); xx.mul_assign(zz);
*yy = *zz;
yy.square(); yy.mul_assign(&mapvals[2]); yy.mul_assign(&mapvals[1]);
let (x, y, z) = unsafe { pt.as_tuple_mut() };
*x = *xx;
*y = *yy;
*z = *zz;
}