

// شاه بدون موازي سازي 
QString ShahGenerationNoP(QString addressIrreducible,int n,int lineNumberTxtIrreducible ){
    QString Sbox;
    if( addressIrreducible  == "#UNKNOWN")
    {
        throw_line("آدرس فايل چندجمله‌اي هاي تغيير ناپذير مشخص نشده است");
        //QMessageBox::critical(new QWidget(),("خطا"),("آدرس فايل چندجمله‌اي هاي تغيير ناپذير مشخص نشده است"));
        return "error";;
    }

    QFile fileSboxs;
    fileSboxs.setFileName(addressIrreducible);
    if(!fileSboxs.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        throw_line("Error open txt Irreducible file (in ShahGenerationNoP)");
        //QMessageBox::critical(new QWidget(),("Error open txt Irreducible file (in ShahGenerationNoP)"),fileSboxs.errorString());
        return "error";
    }else{
//        /*QString addrOneSbox ="txtOneSboxGener.txt";// SETUi->GetAddress()
//        //QString lineTxtSbox;
//        QFile txtOneSbox*/;

        QTextStream stream(&fileSboxs);
        QString lineTxtIrr;
        int linenumber=0;
        int sbLen = pow(2,n);


        int Apoly = rand() % (sbLen);
        while(Apoly==0){
            Apoly = rand() % (sbLen);
        }//a,b,c,d > 0 ???
        int Bpoly = rand() % (sbLen);
        while(Bpoly==0){
            Bpoly = rand() % (sbLen);
        }
        int Cpoly = rand() % (sbLen);
        while(Cpoly==0){
            Cpoly = rand() % (sbLen);
        }
        int Dpoly = rand() % (sbLen);
        while(Dpoly==0){
            Dpoly = rand() % (sbLen);
        }
        int E = rand() % (lineNumberTxtIrreducible );
       // E =4;
//        qDebug() << "A" ;
//        qDebug() << Apoly ;
//        qDebug() << Bpoly ;
//        qDebug() << Cpoly ;
//        qDebug() << Dpoly ;
//        qDebug() << E ;

        QString f_list ;

        linenumber =0;
        while (!stream.atEnd()) {

            lineTxtIrr = stream.readLine();
            if (linenumber == E){
               // qDebug() << lineTxtIrr ;
                f_list = convertPolyToStringBinary(lineTxtIrr,n);
               // qDebug() << f_list ;
                break;
            }
            linenumber++;
        }
        //stream.flush();
        // ********
//        txtOneSbox.setFileName(addrOneSbox);
//        if(!txtOneSbox.open(QFile::ReadWrite | QFile::Truncate)) {
//            QMessageBox::critical(new QWidget(),("error one sboxGener in txtfile::"),txtOneSbox.errorString());
//            return;
//        }
      //  QTextStream out(&txtOneSbox);



       //  *******


        Fint *f_listInt  = (Fint *) malloc (sizeof(Fint) * (n+1));

        QStringList firstList = f_list.split(",");
        int lengthFirstList = firstList.length();
        // f_listInt = firstList;
        for (int i=0 ; i <lengthFirstList ; i++) {
            f_listInt[i] = firstList[i].toUInt();
        }

        const Fint MODULUS = 2;
        const Int DIM = n;

        //1+X+X3+...
       // Fint poly[DIM+1] = {1,1,0,1,1,0,0,0,1};

        GaloisField myGaloisField(MODULUS, DIM, f_listInt);
        GFelement A(&myGaloisField,Apoly);
        GFelement B(&myGaloisField,Bpoly);
        GFelement C(&myGaloisField,Cpoly);
        GFelement D(&myGaloisField,Dpoly);

//        A.setValue(1);
//        B.setValue(2);
//        C.setValue(4);
//        D.setValue(7);
     //      Apoly =10,Bpoly=12,Cpoly=9,Dpoly=20;


        //Fint sb[sbLen];

        Fint *sb;
        sb = (Fint *)malloc(sbLen * sizeof(Fint));
//        for (int i = 0; i < sbLen; i++)
//            memset(sb, 0, sizeof(Fint));

       // qDebug()  << "g1_11";
        int  j;

     //   qDebug()  << Pthread;

        setthread(std::thread::hardware_concurrency());
      //  qDebug()  << "Pthrea :" << Pthread;
       //  setthread(12);
      //  qDebug()  << "Pthrea :" << Pthread;

     //   qDebug()  << "sblen :" << sbLen;

//        // *********************************************************************************************

//        const Fint MODULUS = 2;
//        const Int DIM = (Int)n;
//        GaloisField myGaloisField(MODULUS, DIM, f_listInt);
//        GFelement A(&myGaloisField);
//        GFelement B(&myGaloisField);
//        GFelement C(&myGaloisField);
//        GFelement D(&myGaloisField);

//        A.setValue(Apoly);
//        B.setValue(Bpoly);
//        C.setValue(Cpoly);
//        D.setValue(Dpoly);

// //        A.setValue(3);
// //        B.setValue(2);
// //        C.setValue(4);
// //        D.setValue(7);

//        GFelement s1(&myGaloisField);
//        GFelement s2(&myGaloisField);
//        GFelement s3(&myGaloisField);
        GFelement Si(&myGaloisField);

//        int zfor =0 ;

//        zfor =0;
        for (Fint z = 0; z < sbLen; z++)
        {
           // zfor++;
            if (z != (D/C).getValue() )
            {
                Si.setValue(z);
                sb[z] =(((A*Si)+B)/((C*Si)+D)).getValue();
            }
            else{
                sb[z] = (A/C).getValue();
            }
                        //out  << sb[i];
        }

//        qDebug() << "tshah12-88888888888888888888888888888  zfor:" << zfor ;

//        for (Fint z = 0; z < sbLen; z++)
//        {
//            zfor++;
//            qDebug() << "tshah12-1  Zfor:" << zfor ;
//            if (z != (D/C).getValue() )
//            {
//                Si.setValue(z);
//                qDebug() << "tshah12-2  Z:" << z ;
//                s1 =(A*Si);
//                s2 = s1+B;
//                qDebug() << "tshah12-222  Z:" << z ;
//                s1 = C*Si;
//                s3 = s1+D;
//                qDebug() << "tshah12-233  Z:" << z ;
//                s1 = s2 / s3 ;
//                 qDebug() << "tshah12-244  Z:" << z ;
//                sb[z] = s1.getValue();
//              //  sb[z] =(((A*Si)+B)/((C*Si)+D)).getValue();
//                qDebug() << "tshah12-3  sb[z]:" << sb[z] ;
//            }
//            else{
//                sb[z] = (A/C).getValue();
//                qDebug() << "tshah12-4 1  sb[z]:" << sb[z] ;
//            }
//                        //out  << sb[i];
//        }
//        qDebug() << "tshah12-7777777777777777777777  zfor:" << zfor ;




//        // *********************************************************************************************







       // qDebug()  << "g1_16";












//        for (Fint i=0 ;i< sbLen ; i++ ) {
//            qDebug()  << "g1_12";
//            qDebug()  << (D/C).getValue();
//            qDebug()  << "g1_13";
//            if (i != (D/C).getValue() )
//            {
//                //C.
//                GFelement Si(&myGaloisField);
//                Si.setValue(i);
//                qDebug() << "si";
//                qDebug() << Si.getValue();
//                //sb[i]=
//                sb[i] =(((A*Si)+B)/((C*Si)+D)).getValue();
//            }
//            else{
//                //sb[i]=
//                sb[i] = (A/C).getValue();
//            }
//            //out  << sb[i];
//        }










        Sbox +=QString::number(sb[0]);
        for (int i=1 ; i<pow(2,n); i++) {
            Sbox += " "+ QString::number(sb[i]);
        }

    //    qDebug() << Sbox;
        free(f_listInt);
        free(sb);

     //   out << lineTxtSbox+"\n" ;
       // txtOneSbox.close();

//
    }

    return Sbox;
}






//   end shah 