confid: Remove unsafe from polynomial_div_monic
This commit is contained in:
parent
280e1c7d5f
commit
171e913138
1 changed files with 16 additions and 55 deletions
|
@ -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];
|
||||
|
|
Loading…
Add table
Reference in a new issue