confid: Remove unsafe from polynomial_div_monic

This commit is contained in:
Alex Page 2023-06-28 17:56:06 -04:00
parent 280e1c7d5f
commit 171e913138

View file

@ -323,32 +323,29 @@ fn polynomial_mul(
resultprevdeg
}
unsafe fn polynomial_div_monic(
fn polynomial_div_monic(
adeg: i32,
a: *mut u64,
a: &mut [u64],
bdeg: i32,
b: *const u64,
quotient: *mut u64,
b: &[u64],
mut quotient: Option<&mut [u64]>,
) -> i32 {
let mut i = adeg - bdeg;
while i >= 0_i32 {
let q: u64 = *a.offset((i + bdeg) as isize);
if !quotient.is_null() {
*quotient.offset(i as isize) = q;
let q: u64 = a[(i + bdeg) as usize];
if let Some(ref mut quotient) = quotient {
quotient[i as usize] = q;
}
let mut j = 0_i32;
while j < bdeg {
*a.offset((i + j) as isize) = residue_sub(
*a.offset((i + j) as isize),
residue_mul(q, *b.offset(j as isize)),
);
a[(i + j) as usize] = residue_sub(a[(i + j) as usize], residue_mul(q, b[j as usize]));
j += 1;
}
*a.offset((i + j) as isize) = 0_i32 as u64;
a[(i + j) as usize] = 0_i32 as u64;
i -= 1;
}
i += bdeg;
while i >= 0_i32 && *a.offset(i as isize) == 0_i32 as u64 {
while i >= 0_i32 && a[i as usize] == 0_i32 as u64 {
i -= 1;
}
i
@ -603,43 +600,19 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD
vdeg = polynomial_mul(c2deg, &c2, tmpdeg, &tmp, vdeg, &mut v);
if ddeg > 0_i32 {
let mut udiv: [u64; 5] = [0; 5];
polynomial_div_monic(
udeg,
u.as_mut_ptr(),
ddeg,
d.as_mut_ptr() as *const u64,
udiv.as_mut_ptr(),
);
polynomial_div_monic(udeg, &mut u, ddeg, &d, Some(&mut udiv));
udeg -= ddeg;
polynomial_div_monic(
udeg,
udiv.as_mut_ptr(),
ddeg,
d.as_mut_ptr() as *const u64,
u.as_mut_ptr(),
);
polynomial_div_monic(udeg, &mut udiv, ddeg, &d, Some(&mut u));
udeg -= ddeg;
if vdeg >= 0_i32 {
polynomial_div_monic(
vdeg,
v.as_mut_ptr(),
ddeg,
d.as_mut_ptr() as *const u64,
udiv.as_mut_ptr(),
);
polynomial_div_monic(vdeg, &mut v, ddeg, &d, Some(&mut udiv));
vdeg -= ddeg;
for i in 0..=vdeg {
v[i as usize] = udiv[i as usize];
}
}
}
vdeg = polynomial_div_monic(
vdeg,
v.as_mut_ptr(),
udeg,
u.as_mut_ptr() as *const u64,
std::ptr::null_mut::<u64>(),
);
vdeg = polynomial_div_monic(vdeg, &mut v, udeg, &u, None);
while udeg > 2_i32 {
// u' = monic((f-v^2)/u), v'=-v mod u'
tmpdeg = polynomial_mul(vdeg, &v, vdeg, &v, -1_i32, &mut tmp);
@ -658,13 +631,7 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD
}
tmpdeg = i - 1_i32;
let mut udiv_0: [u64; 5] = [0; 5];
polynomial_div_monic(
tmpdeg,
tmp.as_mut_ptr(),
udeg,
u.as_mut_ptr() as *const u64,
udiv_0.as_mut_ptr(),
);
polynomial_div_monic(tmpdeg, &mut tmp, udeg, &u, Some(&mut udiv_0));
udeg = tmpdeg - udeg;
let mult: u64 = residue_inv(udiv_0[udeg as usize]);
i = 0_i32;
@ -678,13 +645,7 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD
v[i as usize] = residue_sub(0_i32 as u64, v[i as usize]);
i += 1;
}
vdeg = polynomial_div_monic(
vdeg,
v.as_mut_ptr(),
udeg,
u.as_mut_ptr() as *const u64,
std::ptr::null_mut::<u64>(),
);
vdeg = polynomial_div_monic(vdeg, &mut v, udeg, &u, None);
}
if udeg == 2_i32 {
(*dst).u[0_i32 as usize] = u[0_i32 as usize];