16 template <concepts::DivisionRingConcept TRing>
19 using Scalar =
typename TRing::Scalar;
29 Ring g1 = Ring::fromParams(params);
33 Ring g2 = Ring::fromParams(params2);
37 Ring g3 = Ring::fromParams(params3);
39 Ring left_hugging = (g1 * g2) * g3;
40 Ring right_hugging = g1 * (g2 * g3);
43 left_hugging.params(),
44 right_hugging.params(),
45 10.0 * kEpsilonSqrt<Scalar>,
46 "`(g1*g2)*g3 == g1*(g2*g3)` Test for {}, #{}/#{}/#{}",
57 if (Ring::Impl::kIsCommutative) {
61 Ring g1 = Ring::fromParams(params);
65 Ring g2 = Ring::fromParams(params2);
67 Ring left_hugging = g1 * g2;
68 Ring right_hugging = g2 * g1;
71 left_hugging.params(),
72 right_hugging.params(),
74 "`g1 * g2 == g2 * g3` Test for {}, #{}/#{}",
82 size_t num_commutativity = 0;
86 Ring g1 = Ring::fromParams(params);
90 Ring g2 = Ring::fromParams(params2);
91 Ring left_hugging = g1 * g2;
92 Ring right_hugging = g2 * g1;
94 if ((left_hugging.params() - right_hugging.params()).norm() <
95 kEpsilonSqrt<Scalar>) {
101 Scalar commutativity_percentage =
112 Ring g = Ring::fromParams(params);
117 kEpsilonSqrt<Scalar>,
118 "`g + 0 == g` Test for {}, #{}",
128 Ring g = Ring::fromParams(params);
132 (g * Ring::one()).params(),
133 kEpsilonSqrt<Scalar>,
134 "`g * 1 == g` Test for {}, #{}",
139 (g * g.inverse()).params(),
140 Ring::one().params(),
141 kEpsilonSqrt<Scalar>,
142 "`g * 1 == g` Test for {}, #{}",
156 template <concepts::DivisionRingConcept TRing>
157 decltype(TRing::Impl::paramsExamples())
158 const DivisionRingTestSuite<TRing>::kParamsExamples =
159 TRing::Impl::paramsExamples();