1+ """
2+ prec_vec(polygon, relative_precision)
3+
4+ returns the vector by adding the height of the Hodge polygon and appropriate relative precision for each position
5+
6+ INPUTS:
7+ * "polygon" -- A SlopesPolygon struct describing a polygon whose values describe the
8+ divisibility of the roots.
9+ * "relative_precision" -- list, list of relative precisions, can be computed by "calculate_relative_precision"
10+ """
11+ function prec_vec (polygon, relative_precision)
12+ vals = Int .(polygon. values)
13+ hodge_numbers = polygon. slopelengths
14+ prec_vec = reverse (vals)
15+ i = 1
16+ num_term = 1
17+ for j in 1 : length (hodge_numbers)
18+ num_term = num_term + hodge_numbers[j]
19+ while i < num_term
20+ prec_vec[i] = prec_vec[i] + relative_precision[j]
21+ i = i + 1
22+ end
23+ end
24+ prec_vec[length (prec_vec)] = prec_vec[length (prec_vec)] + relative_precision[length (hodge_numbers)]
25+
26+ return prec_vec
27+ end
28+
29+ """
30+ sign_fe(n, d, prec_vec, cp_coeffs)
31+
32+ returns the sign of the functional equation. The sign is always 1 if the dimension of the hypersurface is odd.
33+
34+ INPUTS:
35+ * "n" -- integer, dimension of the ambient projective space
36+ * "d" -- integer, degree of characteristic polygon = dimension of cohomology group
37+ * "prec_vec" -- list, prec_vec[i] = maximum p-adic valuation of the i-th coefficient of the Frobenius char poly?
38+ * "cp_coeffs" -- list, cp_coeffs[i] = i-th coefficient of the Frobenius char poly, which a priori may be incorrect
39+ """
40+ function sign_fe (n, d, prec_vec, cp_coeffs)
41+ sign = 1
42+ dimension = n- 1 # dimension of hypersurface = motivic weight = n-1
43+ if dimension % 2 == 0
44+ for i in 1 : Int (floor (d/ 2 ))
45+ # NOTE-TO-SELF: check if the symmetric index is d-i or d+1-i
46+ p_power = p^ (min (prec_vec[i], prec_vec[d- i]+ ((d- 2 * i)* dimension)// 2 ))
47+ if (mod (cp[i], p_power) != 0 ) && (mod (cp[d- i], p_pwer) != 0 )
48+ if 0 == mod (cp[i] + cp[d- i] * p^ (((d- 2 * i)* dimension)// 2 ), p_power)
49+ sign = - 1
50+ else
51+ sign = 1
52+ @assert 0 == mod (cp[i] - cp[d- i] * p^ (((d- 2 * i)* dimension)// 2 ), p_power)
53+ end
54+ end
55+ end
56+ end
57+
58+ return sign
59+ end
60+
61+ """
62+ apply_symmetry(n, d, p, prec_vec, cp_coeffs, mod, sign)
63+
64+ Update the coefficients in the Frobenius characteristic polynomial using symmetry in the coefficients coming from
65+ the Weil conjecture/Poincare duality
66+
67+ INPUTS:
68+ * "n" -- integer, dimension of the ambient projective space
69+ * "d" -- integer, degree of characteristic polygon = dimension of cohomology group
70+ * "p" -- integer, prime number
71+ * "prec_vec" -- list, prec_vec[i] = maximum p-adic valuation of the i-th coefficient of the Frobenius char poly?
72+ * "cp_coeffs" -- list, cp_coeffs[i] = i-th coefficient of the Frobenius char poly, which a priori may be incorrect
73+ * "mod" -- list, mod[i] = p^(prec_vec[i])
74+ * "sign" -- integer, sign of the functional equation
75+ """
76+ function apply_symmetry (n, d, p, prec_vec, cp_coeffs, mod, sign)
77+ dimension = n- 1
78+ for i in 1 : (div (Pdeg, 2 ) + 1 )
79+ k = ((d- 2 * i) * dimension)// 2
80+ if prec_vec[i] >= prec_vec[d- i] + k
81+ prec_vec[d- i] = prec_vec[i] - k
82+ mod[d- i] = p^ (prec_vec[d- i])
83+ cp_coeffs[d- i] = (sign * cp_coeffs[i])// p^ k # ?
84+ cp_coeffs[d- i] = mod (cp_coeffs[d- i], mod[d- i])
85+ else
86+ prec_vec[i] = prec[d- i] + k
87+ mod[i] = p^ (prec_vec[i])
88+ cp_coeffs[i] = sign * cp_coeffs[d- i] * p^ k
89+ cp_coeffs[i] = mod (cp_coeffs[i], mod[i])
90+ end
91+ end
92+
93+ return cp_coeffs
94+ end
0 commit comments