#include "implementation.h"
Implementation::Implementation()
{
}
QVector<QPair<QString,double> > Implementation::build_freq_char(QString word){
QVector<QPair<QString,double> > returnie(26);
for(int i=0;i<word.length();i++){
int tmp=(int) word.at(i).toAscii()-'a';
returnie[tmp].first=tmp+'a';
returnie[tmp].second=returnie[tmp].second+1;
}
return returnie;
}
QVector<QPair<QString,double> > Implementation::build_freq_char2x(QString word){
QVector<QPair<QString,double> > returnie(26*26);
for(int i=0;i<word.length()/2-1;i++){
int tmp=((int) word.at(2*i).toAscii()-'a')*26+((int) word.at(2*i+1).toAscii()-'a');
returnie[tmp].first=QString(tmp/26+'a')+QString(tmp%26+'a');
returnie[tmp].second=returnie[tmp].second+1;
}
return returnie;
}
QVector<QPair<QString,double> > Implementation::build_freq_char3x(QString word){
QVector<QPair<QString,double> > returnie(26*26*26);
for(int i=0;i<word.length()/3-1;i++){
int tmp=((int) word.at(3*i).toAscii()-'a')*26*26+((int) word.at(3*i+1).toAscii()-'a')*26+((int) word.at(3*i+2).toAscii()-'a');;
returnie[tmp].first=QString(tmp/26/26+'a')+QString(tmp/26%26+'a')+QString(tmp%26+'a');
returnie[tmp].second=returnie[tmp].second+1;
}
return returnie;
}
void Implementation::sum(QVector<QPair<QString,double> > testing,QVector<QPair<QString,double> > &etalon){
for( int i=0;i<testing.size();i++){
etalon[i].second+=testing[i].second;
}
}
bool Implementation::test(QVector <QPair<QString, double> > testing,QVector <QPair<QString, double> > etalon){
QVector<QPair<QString,double> >normalize_etalon;
double cnt=0;
double cnt_tst=0;
for(int j=0;j<etalon.size();j++){
cnt+=etalon[j].second;
cnt_tst+=testing[j].second;
}
normalize_etalon.resize(etalon.size());
for (int i=0;i<etalon.size ();i++){
normalize_etalon[i].first=etalon[i].first;
normalize_etalon[i].second=etalon[i].second/cnt;
testing[i].second/=cnt_tst;
}
for(int i=0;i<testing.size();i++){
if((std::min(testing[i].second,normalize_etalon[i].second)/std::max(testing[i].second,normalize_etalon[i].second))<0.5){
return false;
}
}
return true;
}
QString Implementation::partial_decrypt (QString text,QString cypher, long offset){
QString alphabet="abcdefghijklmnopqrstuvwxyz";
QString returnie;
for (long i=offset;i<text.length ();i++){
int tmp=(int) text.at(i).toAscii()-'a';
int k=(int) cypher.at(i-offset).toAscii()-'a';
returnie.append (alphabet.at((tmp-k+26)%26));
}
return returnie;
}
QString Implementation::decrypt (QString text,QString cypher, QString pwd){
QString alphabet="abcdefghijklmnopqrstuvwxyz";
QString returnie;
for (long i=0;i<pwd.length ();i++){
int tmp=(int) text.at(i).toAscii()-'a';
int k=(int) pwd.at(i).toAscii()-'a';
returnie.append (alphabet.at((tmp-k+26)%26));
}
for (long i=pwd.length ();i<text.length ();i++){
int tmp=(int) text.at(i).toAscii()-'a';
int k=(int) cypher.at(i-pwd.length ()).toAscii()-'a';
returnie.append (alphabet.at((tmp-k+26)%26));
}
return returnie;
}