implements XCRT

parent 0e49f771
...@@ -164,15 +164,19 @@ PositiveDifference(const EffectiveDivisor& D1, const EffectiveDivisor& D2) { ...@@ -164,15 +164,19 @@ PositiveDifference(const EffectiveDivisor& D1, const EffectiveDivisor& D2) {
EffectiveDivisor EffectiveDivisor
Sum(const EffectiveDivisor& D1, const EffectiveDivisor& D2) { Sum(const EffectiveDivisor& D1, const EffectiveDivisor& D2) {
assert(D1.curve() == D2.curve()); assert(D1.curve() == D2.curve());
assert(deg(GCD(D1.get_f(), D2.get_f())) == 0);
if (deg(D1.get_f()) == 0) if (deg(D1.get_f()) == 0)
return D2; return D2;
if (deg(D2.get_f()) == 0) if (deg(D2.get_f()) == 0)
return D1; return D1;
NTL::ZZ_pX gcd, a1, a2;
XGCD(gcd, a1, a2, D1.get_f(), D2.get_f());
assert((D1.get_g() % gcd) == (D2.get_g() % gcd));
ZZ_pX new_f = D1.get_f()*D2.get_f(); ZZ_pX new_f = D1.get_f()*D2.get_f();
ZZ_pX new_g = (D1.get_g()*D2.get_f()*InvMod(D2.get_f() % D1.get_f(), D1.get_f()) + ZZ_pX new_g = (D1.get_g()*a2*(D2.get_f()/gcd) +
D2.get_g()*D1.get_f()*InvMod(D1.get_f() % D2.get_f(), D2.get_f())) % D2.get_g()*a1*(D1.get_f()/gcd)) % (new_f/gcd);
(D1.get_f()*D2.get_f()); new_g = NewtonHenselStep(*D1.curve().get_pdefpol(), new_g, new_f/gcd);
new_g = new_g % new_f;
assert(new_g % D1.get_f() == D1.get_g()); assert(new_g % D1.get_f() == D1.get_g());
assert(new_g % D2.get_f() == D2.get_g()); assert(new_g % D2.get_f() == D2.get_g());
return EffectiveDivisor(D1.curve(), new_f, new_g); return EffectiveDivisor(D1.curve(), new_f, new_g);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment