// condition |is_central(roots,t)| means $t=\exp(2pi\pi)$ with $<p,roots>$ int bool is_central(const WeightList& alpha, const TorusElement& t) { const RatWeight& rw = t.as_Qmod2Z(); // using $\exp(i\pi.)$ is faster, but arithmetic::Numer_t d = 2*rw.denominator(); // it requires even pairings for (weyl::Generator s=0; s<alpha.size(); ++s) if (rw.numerator().dot(alpha[s])%d != 0) // see if division is exact return false; return true; }
bool is_central(const WeightList& alpha, const TorusElement& t) { RatWeight rw = t.as_Qmod2Z(); arithmetic::Numer_t d = 2*rw.denominator(); for (weyl::Generator s=0; s<alpha.size(); ++s) if (alpha[s].dot(rw.numerator())%d != 0) // see if division is exact return false; return true; }
// For a $\xi$-stable torus element, find $\xi$-stable pre-image by $\exp_1$ // We need to correct t.log_2pi, shifting by $X_*$ to make it $\xi$-stable // Return elected choice for the class of rational coweights representing $t$ RatCoweight stable_log(const TorusElement& t, CoweightInvolution xi) { xi+=1; // we just need xi+1, and this is why it was passed by-value CoeffList diagonal; const int_Matrix B = matreduc::adapted_basis(xi,diagonal); const int_Matrix B_inv = B.inverse(); const auto d=diagonal.size(), n=B.numRows(); // Get coordinates on $\xi$-stable part of $B$, and convert back to original // By doing reduction modulo 1 half-way, ensure elected result is produced return B.block(0,0,n,d)*( B_inv.block(0,0,d,n)*t.log_2pi() %=1); }