| | 93 | template <class Blackbox> |
| | 94 | unsigned long &symmetricRank (unsigned long &res, |
| | 95 | const Blackbox &A, |
| | 96 | const MethodTrait::Wiedemann &M) |
| | 97 | { |
| | 98 | typedef typename Blackbox::Field Field; |
| | 99 | const Field F = A.field(); |
| | 100 | typename Field::RandIter iter (F); |
| | 101 | |
| | 102 | commentator.start ("Symmetric Rank", "rank"); |
| | 103 | |
| | 104 | |
| | 105 | std::vector<typename Field::Element> d1, d2; |
| | 106 | size_t i; |
| | 107 | |
| | 108 | VectorWrapper::ensureDim (d1, A.coldim ()); |
| | 109 | |
| | 110 | for (i = 0; i < A.coldim (); i++) |
| | 111 | do iter.random (d1[i]); while (F.isZero (d1[i])); |
| | 112 | |
| | 113 | |
| | 114 | Diagonal<Field> D1 (F, d1); |
| | 115 | |
| | 116 | |
| | 117 | Compose<Diagonal<Field>,Blackbox > B1 (&D1, &A); |
| | 118 | typedef Compose<Compose<Diagonal<Field>,Blackbox >, Diagonal<Field> > BlackBox1; |
| | 119 | BlackBox1 B (&B1, &D1); |
| | 120 | |
| | 121 | BlackboxContainerSymmetric<Field, BlackBox1> TF (&B, F, iter); |
| | 122 | MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD (&TF, M.earlyTermThreshold ()); |
| | 123 | |
| | 124 | WD.pseudo_rank (res); |
| | 125 | |
| | 126 | commentator.stop ("done", NULL, "rank"); |
| | 127 | |
| | 128 | return res; |
| | 129 | } |