24 #ifndef __NILPOTENT_H__
25 #define __NILPOTENT_H__
28 #include "utils/utils.hpp"
116 Nilpotent(std::vector<S> nilpvec, S size);
130 Nilpotent(std::vector<S> nilpvec, S diag, S size);
182 if(nbOne > probSize - 1){
186 std::cout <<
"SMG2S]> Caught Exception: for Nilpotent, nbOne is too large" << std::endl;
190 for(
auto i = 0; i < probSize - 1; i++){
191 if( (i + 1) % (nbOne + 1) == 0 ){
192 indOfZeros.push_back(i);
204 if(nbOne > probSize - diag){
208 std::cout <<
"SMG2S]> Caught Exception: for Nilpotent, nbOne is too large" << std::endl;
212 S length = probSize - diag;
216 while (cnt < length){
217 S l1 = 1 + (rand() % nbOne);
218 S l2 = 1 + (rand() % nbOne);
220 for(
auto i = l1 + cnt; i < l1 + l2 + cnt; i++){
222 indOfZeros.push_back(i);
229 std::vector<S> nilpvec(length);
230 std::fill(nilpvec.begin(), nilpvec.end(), 1);
231 for(
auto i = 0; i < indOfZeros.size(); i++){
232 nilpvec[indOfZeros[i]] = 0;
235 degree = computeDegree(nilpvec);
247 if(nilpvec.size() < size - 1){
251 std::cout <<
"SMG2S]> Caught Exception: for Nilpotent, nilpvec size is not enough" << std::endl;
254 for(
auto i = 0; i < size - 1; i++){
255 if (nilpvec[i] != 0){
257 }
else if(nilpvec[i] == 0){
258 indOfZeros.push_back(i);
274 if(nilpvec.size() < size - offset){
278 std::cout <<
"SMG2S]> Caught Exception: for Nilpotent, nilpvec size is not enough" << std::endl;
281 for(
auto i = 0; i < size - diag; i++){
283 indOfZeros.push_back(i);
287 std::vector<S> vec(nilpvec.begin(), nilpvec.begin() + size - offset);
288 degree = computeDegree(vec);
294 std::vector<S> vectmps(nilpvec.begin(), nilpvec.end());
296 S diag_offset = offset;
300 while (degree <= maxdegree){
301 for(
auto i = 0; i < probSize - offset - diag_offset; i++){
302 vectmps[i] = nilpvec[i] * vectmps[i+offset];
307 bool zeros = std::all_of(vectmps.begin(), vectmps.begin() + probSize-offset - diag_offset, [](S i) { return i==0; });
311 diag_offset = diag_offset + offset;
319 std::cout <<
"Nilpotent: " <<
"Matrix Size = " << probSize <<
", diag_offset = " << offset <<
"; degree = " << degree << std::endl;