@@ -614,6 +614,7 @@ function _minimize(V::GModule{<:Oscar.GAPGroup, <:AbstractAlgebra.FPModule{AbsSi
614
614
@vprint :MinField 1 " descending to $m ...\n "
615
615
pe = mm (m[1 ])
616
616
U, mU = sub (domain (mA), [a for a = domain (mA) if mA (a)(pe) == pe])
617
+ @assert order (U) == divexact (degree (base_ring (V)), degree (m))
617
618
cc = restrict (c, mU)
618
619
fl, b = Oscar. is_coboundary (cc)
619
620
@assert fl
@@ -1649,6 +1650,7 @@ function _rref!(V::Vector{<:MatElem{<:FieldElem}})
1649
1650
for k= o+ 1 : length (V)
1650
1651
iszero (V[k][i]) && continue
1651
1652
V[k] -= V[k][i] * V[o]
1653
+ @assert iszero (V[k][i])
1652
1654
end
1653
1655
o += 1
1654
1656
if o> length (V)
@@ -1676,10 +1678,19 @@ function hom_base(C::GModule{<:Any, <:AbstractAlgebra.FPModule{AbsSimpleNumField
1676
1678
k = base_ring (C)
1677
1679
@assert base_ring (m_in[1 ]) == k
1678
1680
@assert base_ring (m_in[1 ]) == k
1681
+ is_galois = true
1679
1682
while true
1680
1683
p = next_prime (p)
1681
- me = modular_init (k, p, deg_limit = 1 )
1682
- isempty (me) && continue
1684
+ if is_galois
1685
+ me = modular_init (k, p, deg_limit = 1 )
1686
+ isempty (me) && continue
1687
+ if me. ce. n * degree (me. ce. pr[1 ]) != degree (k)
1688
+ is_galois = false
1689
+ continue
1690
+ end
1691
+ else
1692
+ me = modular_init (k, p)
1693
+ end
1683
1694
z1 = Hecke. modular_proj (C, me)
1684
1695
if C === D
1685
1696
z2 = z1
@@ -1689,10 +1700,18 @@ function hom_base(C::GModule{<:Any, <:AbstractAlgebra.FPModule{AbsSimpleNumField
1689
1700
t = []
1690
1701
for i= 1 : length (z1)
1691
1702
mp = hom_base (z1[i], z2[i])
1703
+ # for x = mp
1704
+ # h = hom(z1[i].M, z2[i].M, x)
1705
+ # @assert is_G_hom(z1[i], z2[i], h)
1706
+ # end
1692
1707
if isempty (mp)
1693
1708
return dense_matrix_type (base_ring (C))[]
1694
1709
end
1695
1710
_rref! (mp)
1711
+ # for x = mp
1712
+ # h = hom(z1[i].M, z2[i].M, x)
1713
+ # @assert is_G_hom(z1[i], z2[i], h)
1714
+ # end
1696
1715
push! (t, mp)
1697
1716
end
1698
1717
# should actually compute an rref of the hom base to make sure
@@ -1705,15 +1724,29 @@ function hom_base(C::GModule{<:Any, <:AbstractAlgebra.FPModule{AbsSimpleNumField
1705
1724
return []
1706
1725
end
1707
1726
1727
+ # _t = deepcopy(t)
1708
1728
tt = [Hecke. modular_lift ([t[i][j] for i= 1 : length (z1)], me) for j= 1 : length (t[1 ])]
1729
+ # for l=1:length(tt)
1730
+ # _s = Hecke.modular_proj(tt[l], me)
1731
+ # @assert all(ll -> _s[ll] == _t[ll][l], 1:length(_s))
1732
+ # end
1733
+
1734
+ # tst = [[m_in[i]*s - s*m_out[i] for i= 1:length(m_in)] for s = tt]
1735
+ # @show [[map_entries(x->valuation(x, ZZ(p)), y) for y = z] for z = tst]
1736
+ # if valuation(tst[1][1][1,1], ZZ(p)) == 0
1737
+ # global last_bad = (tst, tt, p)
1738
+ # error("bad")
1739
+ # end
1709
1740
@assert base_ring (tt[1 ]) == k
1710
1741
if isone (pp)
1711
1742
pp = ZZRingElem (p)
1712
1743
T = tt
1713
1744
else
1714
1745
T = [induce_crt (tt[i], T[i], ZZRingElem (p), pp) for i= 1 : length (T)]
1746
+ # tst = [[m_in[i]*s - s*m_out[i] for i= 1:length(m_in)] for s = T]
1715
1747
@assert base_ring (T[1 ]) == k
1716
1748
pp *= p
1749
+ # @show [[map_entries(x->valuation(x, pp), y) for y = z] for z = tst]
1717
1750
S = typeof (T[1 ])[]
1718
1751
for t = T
1719
1752
fl, s = induce_rational_reconstruction (t, pp, ErrorTolerant = true )
@@ -1732,6 +1765,11 @@ function hom_base(C::GModule{<:Any, <:AbstractAlgebra.FPModule{AbsSimpleNumField
1732
1765
end
1733
1766
end
1734
1767
1768
+ function Hecke. valuation (a:: NumFieldElem , p:: ZZRingElem )
1769
+ iszero (a) && return - 1
1770
+ return minimum ([valuation (coeff (a, i), p) for i= 0 : degree (parent (a))- 1 if ! iszero (coeff (a, i))])
1771
+ end
1772
+
1735
1773
function center_hom_base (C:: GModule{<:Any, <:AbstractAlgebra.FPModule{QQFieldElem}} )
1736
1774
p = Hecke. p_start
1737
1775
p = 2 ^ 10
@@ -1749,14 +1787,10 @@ function center_hom_base(C::GModule{<:Any, <:AbstractAlgebra.FPModule{QQFieldEle
1749
1787
while true
1750
1788
p = next_prime (p)
1751
1789
z1 = gmodule (Native. GF (p), C)
1752
- @show p
1753
- @time t = hom_base (z1, z1)
1754
- @show length (t)
1790
+ t = hom_base (z1, z1)
1755
1791
isempty (t) && return QQMatrix[]
1756
- @time c, mc = center (matrix_algebra (base_ring (z1), t; isbasis = true ))
1757
- @show c
1792
+ c, mc = center (matrix_algebra (base_ring (z1), t; isbasis = true ))
1758
1793
t = [mc (x). matrix for x = basis (c)]
1759
- @show length (t)
1760
1794
1761
1795
_rref! (t)
1762
1796
tt = [lift (s) for s= t]
@@ -1954,7 +1988,7 @@ function split_homogeneous(M::GModule{<:Any, <:AbstractAlgebra.FPModule{QQFieldE
1954
1988
B = lll_basis (Z_M)
1955
1989
@assert all (! iszero, B)
1956
1990
seen = Set {elem_type(E)} ()
1957
- #=
1991
+
1958
1992
for b = B
1959
1993
x = b. elem_in_algebra
1960
1994
if x in seen
@@ -1985,7 +2019,7 @@ function split_homogeneous(M::GModule{<:Any, <:AbstractAlgebra.FPModule{QQFieldE
1985
2019
length (z) > 0 && return z
1986
2020
end
1987
2021
end
1988
- = #
2022
+ #
1989
2023
1990
2024
#=
1991
2025
p = 10000
@@ -2009,7 +2043,7 @@ function split_homogeneous(M::GModule{<:Any, <:AbstractAlgebra.FPModule{QQFieldE
2009
2043
end
2010
2044
=#
2011
2045
2012
- #=
2046
+
2013
2047
mb = matrix (QQ, transpose (hcat ([coefficients (x. elem_in_algebra) for x = B]. .. )))
2014
2048
T = 10
2015
2049
for i= 1 : T
@@ -2024,7 +2058,7 @@ function split_homogeneous(M::GModule{<:Any, <:AbstractAlgebra.FPModule{QQFieldE
2024
2058
length (z) > 0 && return z
2025
2059
end
2026
2060
end
2027
- =#
2061
+
2028
2062
2029
2063
return S
2030
2064
end
@@ -2067,10 +2101,11 @@ function split_homogeneous2(M::GModule{<:Any, <:AbstractAlgebra.FPModule{QQField
2067
2101
local best_f:: QQPolyRingElem
2068
2102
local best_i:: elem_type (E)
2069
2103
2070
- for i= basis (E)
2104
+ for _i= lll_basis (Z_M)
2105
+ i = _i. elem_in_algebra
2071
2106
f = minpoly (i)
2072
2107
lf = factor (f)
2073
- if length (lf) == 1 && degree (f) == s* m* k && lf[f] == 1
2108
+ if length (lf) == 1 && degree (f) == s* m* k && haskey (lf . fac, f)
2074
2109
if first
2075
2110
best_f = f
2076
2111
best_i = i
@@ -2104,6 +2139,7 @@ function Oscar.eigenspace(f::Oscar.GModuleHom{<:Any, T, T}, a::AbsSimpleNumField
2104
2139
@req codomain (f) == M " 1st argument must be an endomorphism"
2105
2140
Mf = extension_of_scalars (M, Ka)
2106
2141
h = hom (Mf, Mf, hom (Mf. M, Mf. M, map_entries (Ka, f. module_map. matrix) - a* identity_matrix (Ka, dim (M))))
2142
+ global last_h = h
2107
2143
return kernel (h)[1 ]
2108
2144
end
2109
2145
@@ -2328,52 +2364,67 @@ function action_matrices(C::GModule{<:Any, <:AbstractAlgebra.FPModule})
2328
2364
return map (matrix, action (C))
2329
2365
end
2330
2366
2331
- #=
2332
2367
function form_reynold (C:: GModule{<:Any, <:AbstractAlgebra.FPModule{ZZRingElem}} )
2333
2368
I = identity_matrix (ZZ, rank (C. M))
2334
- O = I
2335
2369
de = ZZ (1 )
2370
+ iter = []
2336
2371
for x = C. ac
2337
- O *= (I-matrix(x))
2338
- de *= 2
2372
+ push! (iter, [matrix (x)])
2373
+ l = 1
2374
+ while ! is_one (iter[end ][end ])
2375
+ push! (iter[end ], iter[end ][1 ]* iter[end ][end ])
2376
+ l += 1
2377
+ end
2378
+ @assert length (iter[end ]) == l
2379
+ @assert is_one (iter[end ][end ])
2380
+ de *= l
2339
2381
end
2340
- for i=1:-1
2382
+ for i= 1 : - 4
2341
2383
l = rand (C. G)
2342
- O *= (I-action(C, l).matrix)
2384
+ is_one (l) && continue
2385
+
2386
+ push! (iter, [I, action (C, l). matrix])
2343
2387
de *= 2
2344
- @show order(l)
2345
2388
end
2346
2389
a = identity_matrix (ZZ, rank (C. M))
2347
- @show rank(C.M)
2390
+ a = matrix (ZZ, rand (- 10 : 10 , rank (C. M), rank (C. M)))
2391
+ a = a* transpose (a)
2392
+ @assert is_symmetric (a)
2393
+ @assert is_positive_definite (a)
2394
+
2348
2395
den = ZZ (1 )
2349
2396
for i= 1 : 70
2350
2397
# @assert is_symmetric(a)
2351
2398
# @show signature_tuple(integer_lattice(;gram = a))
2352
2399
# @assert is_positive_definite(a)
2353
2400
# global last_a_in = deepcopy(a)
2354
- a = transpose(O)*a*(O)
2401
+ for D = iter
2402
+ a = sum (t* a* transpose (t) for t = D)
2403
+ end
2355
2404
# global last_a_out = (a, g)
2356
2405
2357
2406
# @assert is_symmetric(a)
2358
2407
# @show signature_tuple(integer_lattice(;gram = a))
2359
2408
# @assert is_positive_definite(a)
2360
2409
den *= de
2361
2410
@show nbits (den), maximum (nbits, a)
2362
- aa = a*QQ(1, 240* den)
2363
- @assert is_positive_definite(aa)
2411
+ aa = a* QQ (order (C . G), den)
2412
+ # @assert is_positive_definite(aa)
2364
2413
aa = map_entries (x-> abs (x- round (x)), aa)
2365
- @show [nbits(denominator(x)) for x = convergents(continued_fraction(aa[10,10]))]
2414
+ # @show [nbits(denominator(x)) for x = convergents(continued_fraction(aa[10,10]))]
2366
2415
@show maximum (aa)* 1.0
2367
2416
if maximum (aa) < 1e-5
2368
- a = map_entries(x->round(ZZRingElem, QQ(x, den)), a)
2369
- error("ASDasd")
2417
+ a = map_entries (x-> round (ZZRingElem, QQ (x* order (C. G), den)), a)
2418
+ if any (x-> x. matrix * a * transpose (x. matrix) != a, C. ac)
2419
+ @show :bad
2420
+ continue
2421
+ end
2370
2422
@assert is_positive_definite (a)
2371
2423
return a
2372
2424
end
2373
2425
end
2374
2426
end
2375
2427
2376
- =#
2377
2428
2378
2429
function Oscar. simplify (C:: GModule{<:Any, <:AbstractAlgebra.FPModule{ZZRingElem}} )
2379
2430
# f = invariant_forms(C)[1]
@@ -2382,32 +2433,27 @@ function Oscar.simplify(C::GModule{<:Any, <:AbstractAlgebra.FPModule{ZZRingElem}
2382
2433
m = map (matrix, C. ac)
2383
2434
S = identity_matrix (ZZ, dim (C))
2384
2435
while true
2385
- f = zero_matrix (ZZ, dim (C), dim (C))
2386
- for i= (C. G)
2387
- @show i
2388
- x = action (C, i)
2389
- f = f + matrix (x)* transpose (matrix (x))
2390
- @assert is_symmetric (f)
2391
- end
2436
+ # f = zero_matrix(ZZ, dim(C), dim(C))
2437
+ # for i=(C.G)
2438
+ # @show i
2439
+ # x = action(C, i)
2440
+ # f = f + matrix(x)*transpose(matrix(x))
2441
+ # @assert is_symmetric(f)
2442
+ # end
2443
+ f = form_reynold (C)
2392
2444
# @assert is_symmetric(f)
2393
2445
# @assert is_positive_definite(f)
2394
- global last_f = f
2395
2446
L, T = lll_gram_with_transform (f)
2396
2447
@assert L == T* f* transpose (T)
2397
2448
2398
2449
Ti = inv (T)
2399
2450
n = [T* x* Ti for x = m]
2400
- @show length (string (n)), length (string (m))
2401
- @show sum ([maximum (nbits, x) for x = n])
2402
- @show sum ([maximum (nbits, x) for x = m])
2403
2451
if length (string (n)) >= length (string (m))
2404
2452
return C, S
2405
2453
end
2406
- error (" ASD" )
2407
2454
S = T* S
2408
2455
C = gmodule (group (C), n)
2409
- f = invariant_forms (C)[1 ]
2410
- M = n
2456
+ m = n
2411
2457
end
2412
2458
end
2413
2459
0 commit comments