Skip to content

crt_inv does not like negative numbers #1862

@JohnAAbbott

Description

@JohnAAbbott

crt_inv takes much longer (sometimes 10x as long) on negative inputs than on positive ones.

# crt_inv does not like negative numbers

L = collect(PrimesSet(1000000,5000000));

ce = crt_env(ZZ.(L));

function f1(ce::crt_env)
  v = ZZ(123456789);
  return crt_inv(v,ce);
end

function f1seq(L::Vector{Int})
  v = ZZ(123456789);
  return [v%p  for p in L];
end

function f2(ce::crt_env)
  v = ZZ(-123456789);
  return crt_inv(v,ce);
end

function f2seq(L::Vector{Int})
  v = ZZ(-123456789);
  return [v%p  for p in L];
end

function f3(ce::crt_env)
  v = ZZ(1023)^819; # a bit less than 2^8192
  return crt_inv(v,ce);
end

function f4(ce::crt_env)
  v = -ZZ(1023)^819; # a bit less than 2^8192
  return crt_inv(v,ce);
end

function f4a(ce::crt_env)
  v = -ZZ(1023)^819; # a bit less than 2^8192
  return -crt_inv(-v,ce);
end


Base.GC.gc(true);
Base.GC.enable(false);

println("Sequential: reduce positive");
jj1 = f1seq(L);
@time jj1 = f1seq(L);

println("Sequential: reduce negative");
jj2 = f2seq(L);
@time jj2 = f2seq(L);

println("Tree: reduce small positive");
j1 = f1(ce);  # just to force compilation
@time j1 = f1(ce);

println("Tree: reduce small negative");
j2 = f2(ce);  # just to force compilation
@time j2 = f2(ce);

println("Tree: reduce large positive");
j3 = f3(ce);  # just to force compilation
@time j3 = f3(ce);

println("Tree: reduce large negative");
j4 = f4(ce);  # just to force compilation
@time j4 = f4(ce);

println("Tree: negate reduction of large positive");
j4a = f4a(ce);  # just to force compilation
@time j4a = f4a(ce);

Base.GC.enable(true);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions