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
|
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];
|
||||||
|
|
Loading…
Add table
Reference in a new issue