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 resultprevdeg
} }
unsafe fn polynomial_div_monic( fn polynomial_div_monic(
adeg: i32, adeg: i32,
a: *mut u64, a: &mut [u64],
bdeg: i32, bdeg: i32,
b: *const u64, b: &[u64],
quotient: *mut u64, mut quotient: Option<&mut [u64]>,
) -> i32 { ) -> i32 {
let mut i = adeg - bdeg; let mut i = adeg - bdeg;
while i >= 0_i32 { while i >= 0_i32 {
let q: u64 = *a.offset((i + bdeg) as isize); let q: u64 = a[(i + bdeg) as usize];
if !quotient.is_null() { if let Some(ref mut quotient) = quotient {
*quotient.offset(i as isize) = q; quotient[i as usize] = q;
} }
let mut j = 0_i32; let mut j = 0_i32;
while j < bdeg { while j < bdeg {
*a.offset((i + j) as isize) = residue_sub( a[(i + j) as usize] = residue_sub(a[(i + j) as usize], residue_mul(q, b[j as usize]));
*a.offset((i + j) as isize),
residue_mul(q, *b.offset(j as isize)),
);
j += 1; j += 1;
} }
*a.offset((i + j) as isize) = 0_i32 as u64; a[(i + j) as usize] = 0_i32 as u64;
i -= 1; i -= 1;
} }
i += bdeg; 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 -= 1;
} }
i 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); vdeg = polynomial_mul(c2deg, &c2, tmpdeg, &tmp, vdeg, &mut v);
if ddeg > 0_i32 { if ddeg > 0_i32 {
let mut udiv: [u64; 5] = [0; 5]; let mut udiv: [u64; 5] = [0; 5];
polynomial_div_monic( polynomial_div_monic(udeg, &mut u, ddeg, &d, Some(&mut udiv));
udeg,
u.as_mut_ptr(),
ddeg,
d.as_mut_ptr() as *const u64,
udiv.as_mut_ptr(),
);
udeg -= ddeg; udeg -= ddeg;
polynomial_div_monic( polynomial_div_monic(udeg, &mut udiv, ddeg, &d, Some(&mut u));
udeg,
udiv.as_mut_ptr(),
ddeg,
d.as_mut_ptr() as *const u64,
u.as_mut_ptr(),
);
udeg -= ddeg; udeg -= ddeg;
if vdeg >= 0_i32 { if vdeg >= 0_i32 {
polynomial_div_monic( polynomial_div_monic(vdeg, &mut v, ddeg, &d, Some(&mut udiv));
vdeg,
v.as_mut_ptr(),
ddeg,
d.as_mut_ptr() as *const u64,
udiv.as_mut_ptr(),
);
vdeg -= ddeg; vdeg -= ddeg;
for i in 0..=vdeg { for i in 0..=vdeg {
v[i as usize] = udiv[i as usize]; v[i as usize] = udiv[i as usize];
} }
} }
} }
vdeg = polynomial_div_monic( vdeg = polynomial_div_monic(vdeg, &mut v, udeg, &u, None);
vdeg,
v.as_mut_ptr(),
udeg,
u.as_mut_ptr() as *const u64,
std::ptr::null_mut::<u64>(),
);
while udeg > 2_i32 { while udeg > 2_i32 {
// u' = monic((f-v^2)/u), v'=-v mod u' // u' = monic((f-v^2)/u), v'=-v mod u'
tmpdeg = polynomial_mul(vdeg, &v, vdeg, &v, -1_i32, &mut tmp); 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; tmpdeg = i - 1_i32;
let mut udiv_0: [u64; 5] = [0; 5]; let mut udiv_0: [u64; 5] = [0; 5];
polynomial_div_monic( polynomial_div_monic(tmpdeg, &mut tmp, udeg, &u, Some(&mut udiv_0));
tmpdeg,
tmp.as_mut_ptr(),
udeg,
u.as_mut_ptr() as *const u64,
udiv_0.as_mut_ptr(),
);
udeg = tmpdeg - udeg; udeg = tmpdeg - udeg;
let mult: u64 = residue_inv(udiv_0[udeg as usize]); let mult: u64 = residue_inv(udiv_0[udeg as usize]);
i = 0_i32; 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]); v[i as usize] = residue_sub(0_i32 as u64, v[i as usize]);
i += 1; i += 1;
} }
vdeg = polynomial_div_monic( vdeg = polynomial_div_monic(vdeg, &mut v, udeg, &u, None);
vdeg,
v.as_mut_ptr(),
udeg,
u.as_mut_ptr() as *const u64,
std::ptr::null_mut::<u64>(),
);
} }
if udeg == 2_i32 { if udeg == 2_i32 {
(*dst).u[0_i32 as usize] = u[0_i32 as usize]; (*dst).u[0_i32 as usize] = u[0_i32 as usize];