thofma/Hecke.jl

Random test failures in `NfOrd/PicardGroup.jl`

lgoettgens opened this issue · 5 comments

observed in the downstream tests in AA in https://github.com/Nemocas/AbstractAlgebra.jl/actions/runs/9224253991/job/25379194623?pr=1715#step:7:169

Error During Test at /home/runner/.julia/packages/Hecke/SZzwT/test/NfOrd/PicardGroup.jl:61
  Got exception outside of a @test
  AssertionError: $(Expr(:escape, :(nbits(pp) < 10000)))
  Stacktrace:
    [1] macro expansion
      @ ~/.julia/packages/Hecke/SZzwT/src/Assertions.jl:507 [inlined]
    [2] evaluate_mod(a::FacElem{AbsSimpleNumFieldElem, AbsSimpleNumField}, B::AbsSimpleNumFieldOrderFractionalIdeal)
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumField/NfAbs/CompactRepresentation.jl:361
    [3] macro expansion
      @ ~/.julia/packages/Hecke/SZzwT/src/Hecke.jl:476 [inlined]
    [4] compact_presentation(a::FacElem{AbsSimpleNumFieldElem, AbsSimpleNumField}, nn::Int64; decom::Dict{AbsSimpleNumFieldOrderIdeal, ZZRingElem}, arb_prec::Int64, short_prec::Int64)
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumField/NfAbs/CompactRepresentation.jl:217
    [5] compact_presentation
      @ ~/.julia/packages/Hecke/SZzwT/src/NumField/NfAbs/CompactRepresentation.jl:10 [inlined]
    [6] macro expansion
      @ ~/.julia/packages/Hecke/SZzwT/src/Hecke.jl:476 [inlined]
    [7] _ispower(a::FacElem{AbsSimpleNumFieldElem, AbsSimpleNumField}, n::Int64; with_roots_unity::Bool, decom::Dict{AbsSimpleNumFieldOrderIdeal, ZZRingElem}, trager::Bool)
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumField/NfAbs/CompactRepresentation.jl:435
    [8] is_power(a::FacElem{AbsSimpleNumFieldElem, AbsSimpleNumField}, n::Int64; with_roots_unity::Bool, decom::Dict{AbsSimpleNumFieldOrderIdeal, ZZRingElem}, trager::Bool, easy::Bool)
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumField/NfAbs/CompactRepresentation.jl:427
    [9] macro expansion
      @ ~/.julia/packages/Hecke/SZzwT/src/Hecke.jl:476 [inlined]
   [10] saturate!(d::Hecke.ClassGrpCtx{SMat{ZZRingElem, Hecke.ZZRingElem_Array_Mod.ZZRingElem_Array}}, U::Hecke.UnitGrpCtx{FacElem{AbsSimpleNumFieldElem, AbsSimpleNumField}}, n::Int64, stable::Float64; use_orbit::Bool, easy_root::Bool, use_LLL::Bool)
      @ Hecke.RelSaturate ~/.julia/packages/Hecke/SZzwT/src/NumFieldOrd/NfOrd/Clgp/Saturate.jl:449
   [11] saturate!(d::Hecke.ClassGrpCtx{SMat{ZZRingElem, Hecke.ZZRingElem_Array_Mod.ZZRingElem_Array}}, U::Hecke.UnitGrpCtx{FacElem{AbsSimpleNumFieldElem, AbsSimpleNumField}}, n::Int64, stable::Float64)
      @ Hecke.RelSaturate ~/.julia/packages/Hecke/SZzwT/src/NumFieldOrd/NfOrd/Clgp/Saturate.jl:411
   [12] _class_unit_group(O::AbsSimpleNumFieldOrder; saturate_at_2::Bool, bound::Int64, method::Int64, large::Int64, redo::Bool, unit_method::Int64, use_aut::Bool, GRH::Bool)
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumFieldOrd/NfOrd/Clgp.jl:305
   [13] class_group(O::AbsSimpleNumFieldOrder; bound::Int64, method::Int64, redo::Bool, unit_method::Int64, large::Int64, use_aut::Bool, GRH::Bool, do_lll::Bool, saturate_at_2::Bool)
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumFieldOrd/NfOrd/Clgp.jl:432
   [14] class_group
      @ ~/.julia/packages/Hecke/SZzwT/src/NumFieldOrd/NfOrd/Clgp.jl:420 [inlined]
   [15] _picard_group(O::AbsSimpleNumFieldOrder)
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumFieldOrd/NfOrd/PicardGroup.jl:206
   [16] (::Hecke.var"#2714#2715"{AbsSimpleNumFieldOrder})()
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumFieldOrd/NfOrd/PicardGroup.jl:19
   [17] get!(default::Hecke.var"#2714#2715"{AbsSimpleNumFieldOrder}, h::Dict{Symbol, Any}, key::Symbol)
      @ Base ./dict.jl:479
   [18] get_attribute!
      @ ~/work/AbstractAlgebra.jl/AbstractAlgebra.jl/src/Attributes.jl:230 [inlined]
   [19] picard_group(O::AbsSimpleNumFieldOrder)
      @ Hecke ~/.julia/packages/Hecke/SZzwT/src/NumFieldOrd/NfOrd/PicardGroup.jl:14
   [20] macro expansion
      @ ~/.julia/packages/Hecke/SZzwT/test/NfOrd/PicardGroup.jl:110 [inlined]
   [21] macro expansion
      @ /opt/hostedtoolcache/julia/1.10.3/x64/share/julia/stdlib/v1.10/Test/src/Test.jl:1577 [inlined]
   [22] top-level scope
      @ ~/.julia/packages/Hecke/SZzwT/test/NfOrd/PicardGroup.jl:62
   [23] include
      @ ./Base.jl:495 [inlined]
   [24] macro expansion
      @ ~/.julia/packages/Hecke/SZzwT/test/testdefs.jl:23 [inlined]
   [25] macro expansion
      @ /opt/hostedtoolcache/julia/1.10.3/x64/share/julia/stdlib/v1.10/Test/src/Test.jl:1577 [inlined]
   [26] macro expansion
      @ ~/.julia/packages/Hecke/SZzwT/test/testdefs.jl:22 [inlined]
   [27] macro expansion
      @ ./timing.jl:503 [inlined]
   [28] runtests(name::String, path::String; isolate::Bool, seed::UInt128)
      @ Main ~/.julia/packages/Hecke/SZzwT/test/testdefs.jl:20
   [29] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::@Kwargs{seed::UInt128, isolate::Bool})
      @ Base ./essentials.jl:894
   [30] (::Distributed.var"#110#112"{Distributed.CallMsg{:call_fetch}})()
      @ Distributed /opt/hostedtoolcache/julia/1.10.3/x64/share/julia/stdlib/v1.10/Distributed/src/process_messages.jl:287
   [31] run_work_thunk(thunk::Distributed.var"#110#112"{Distributed.CallMsg{:call_fetch}}, print_error::Bool)
      @ Distributed /opt/hostedtoolcache/julia/1.10.3/x64/share/julia/stdlib/v1.10/Distributed/src/process_messages.jl:70
   [32] (::Distributed.var"#109#111"{Distributed.CallMsg{:call_fetch}, Distributed.MsgHeader, Sockets.TCPSocket})()
      @ Distributed /opt/hostedtoolcache/julia/1.10.3/x64/share/julia/stdlib/v1.10/Distributed/src/process_messages.jl:287

@fieker Just a breadcrumb: It seems that we are often running into saturation and are trying to compute roots of large elements:

for i in 1:100
  begin
    Qx, x = QQ["x"]
    f = x^4-3072*x^3+7926*x^2-3920*x-9063
    K, a = number_field(f, "a", cached = false)
    unit_group(maximal_order(f))
  end
end

Tracking the nbits(pp) (aka how many primes used in evaluate_mod), for current master we get:

[ Info: nbits(pp) when done: 26281
[ Info: nbits(pp) when done: 13141
[ Info: nbits(pp) when done: 6601
[ Info: nbits(pp) when done: 3121
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 6601
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 8581
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 3241
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 15181
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 9721
[ Info: nbits(pp) when done: 3181

With version 0.30.12 (which uses flint 2.9):

[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61
[ Info: nbits(pp) when done: 61

Seems that our relations are worse?

that would indicate LLL changes? Shouldn't all be reduced?
I.e evalmod should be used on units that are small

Just run into this when it caused CI tests in AbstractALgebra to fail :-(

Probably the same problem as the following. On master:

julia> Qx, x = QQ["x"];

julia> f = x^6 - 7*x^4 + 14*x^2 - 7;

julia> K, _a = number_field(f; cached = false);

julia> _x = -2*_a^5 + 2*_a^4 + 12*_a^3 - 12*_a^2 - 17*_a + 18
-2*_a^5 + 2*_a^4 + 12*_a^3 - 12*_a^2 - 17*_a + 18

julia> evaluate(Hecke.reduce_mod_powers(_x, 2))
-638*_a^5 - 1014*_a^4 + 2904*_a^3 + 4628*_a^2 - 1825*_a - 2910

With flint 2.9 (aka Hecke 0.31.4):

julia> Qx, x = QQ["x"];

julia> f = x^6 - 7*x^4 + 14*x^2 - 7;

julia> K, _a = number_field(f; cached = false);

julia> _x = -2*_a^5 + 2*_a^4 + 12*_a^3 - 12*_a^2 - 17*_a + 18
-2*_a^5 + 2*_a^4 + 12*_a^3 - 12*_a^2 - 17*_a + 18

julia> evaluate(Hecke.reduce_mod_powers(_x, 2))
_a + 2

Fixed