Статистически оптимальный генератор псевдослучайных последовательностей
Свойства равномерно распределенной псевдослучайной последовательности. Линейный и квадратичный конгруэнтный генератор. Исследование RSA-алгоритма генерации псевдослучайных последовательностей. Универсальный алгоритм статистического тестирования Маурера.
Рубрика | Математика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 06.11.2011 |
Размер файла | 2,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
start = clock();
for( ; ; )
{
k = rand();
iNod = NOD(k,fi);
if(iNod == 1)
break;
}
finish = clock();
tmp = (double)(finish - start)/100;
printf("Time4 =\t%1.5f (sec)\n", tmp/CLOCKS_PER_SEC);
u0= rand();
cout<<"INput n: ";
cin>> n;
start = clock();
iPrev = u0;
for(i=0; i<n; i++)
{
iNext.setpowmod(iPrev,k,N);
iPrev = iNext;
iNext %= 2;
file_opn<<iNext<<" ";
}
finish = clock();
tmp = (double)(finish - start)/100;
printf("Time5 =\t%1.5f (sec)\n", tmp/CLOCKS_PER_SEC);
return 0;
}
Сдвиговый регистр
int plusmod2(int a, int b)
{
int res;
if (((a == 0)&&(b == 1))||((a == 1)&&(b == 0)))
res = 1;
else
res = 0;
return res;
}
int main()
{
int *reg;
int *out;
int iTemp;
int i,n,j,k=20000;
int razr = 29;
int count0 = 0;
int count1 = 0;
ofstream file_opn;
file_opn.open("SQ_shift.txt");
cout<<" Input num of sq(n>20000): ";
cin>>n;
reg = new int[razr];
out = new int[n];
for(i=0; i<razr; i++)
{
if(i == (razr-1))
reg[i] = 1;
else
reg[i] = 0;
}
for(i=0; i<n; i++)
{
out[i] = reg[0];
iTemp = plusmod2(reg[0],reg[1]);
for(j=0; j<razr; j++)
reg[j] = reg[j+1];
reg[razr] = iTemp;
}
for(i=k; i<n; i++)
{
file_opn<<out[i]<<" ";
}
for(i=0; i<n; i++)
{
if(out[i] == 0)
count0++;
else
count1++;
}
cout<<"\n";
cout<<"Num of 0: "<<count0;
cout<<"Num of 1: "<<count1;
return 0;
}
Самоуправляемый 2-линейный регистр сдвига.
int main()
{
int i,j,k,in,out,num,tmp;
int m = 31;
int sq[31][31];
ofstream file_opn;
file_opn.open("SQ_2shift.txt");
srand(time(NULL));
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
sq[i][j] = rand()%4;
}
cout<<"Input length of sq: ";
cin>>num;
for(k=0; k<num; k++)
{
if(sq[0][2] == 0)
in = 0;
if(sq[0][2] == 1)
in = 1;
if(sq[0][2] == 2)
in = 0;
if(sq[0][2] == 3)
in = 1;
if(in == 0)
{
for(i=0; i<m-1; i++)
{
tmp = sq[i][30];
sq[i][30] = sq[i][0];
for(j=0; j<m-1; j++)
{
if(j == 29)
sq[i][j] = tmp;
else
sq[i][j] = sq[i][j+1];
}
}
}
else
{
for(j=0; j<m-1; j++)
{
tmp = sq[30][j];
sq[30][j] = sq[0][j];
for(i=0; i<m-1; i++)
{
if(i == 29)
sq[i][j] = tmp;
else
sq[i][j] = sq[i+1][j];
}
}
}
if(sq[29][28] == 0)
out = 0;
if(sq[29][28] == 1)
out = 0;
if(sq[29][28] == 2)
out = 1;
if(sq[29][28] == 3)
out = 1;
file_opn<<out<<" ";
}
return 0;
}
Тест n-серий
const double table_hi[2][15] ={{0.01,0.025,0.05,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.95,0.975,0.99},
{0.1148,0.2158,0.3518,0.5844,1.0052,1.4237,1.8692,2.3660,2.9462,3.6649,4.6416,6.2514,7.8147,9.3484,11.3449}};
int main()
{
int N = 500;
int M = N/2;
int i,j,k=0;
int len=0;
int n = 4; //число степеней свободы
int iV[4];
double p0j;
int *sq;
int **sqi;
int **V; // частота попадания
int *Vk;
int pairs[2][4];
double hi_kv = 0;
double itmp;
double alfa = 0.05; //уровень значимости (5%, 1%, 0.1%);
sqi = new int*[2];
sqi[0] = new int[M];
sqi[1] = new int[M];
V = new int*[2];
V[0] = new int[M];
V[1] = new int[M];
sq = new int[N];
Vk = new int[N];
pairs[0][0] = 0;
pairs[1][0] = 0;
pairs[0][1] = 0;
pairs[1][1] = 1;
pairs[0][2] = 1;
pairs[1][2] = 0;
pairs[0][3] = 1;
pairs[1][3] = 1;
char* file_name = "SQ_2shift.txt";
FILE *in;
in=fopen(file_name,"r");
if(in==NULL )
printf("\nIncorrect input file\n");
for(i=0; i<N; i++)
{
fscanf(in,"%d",&sq[i]);
len++;
}
for(i=0; i<N; i++)
cout<<sq[i]<<" ";
// сам тест
p0j = 1/(pow(N,2)); // вероятность появления пары чисел, квадрат - тк они могут местами меняться.
for(i=0; i<M; i++)
{
for(j=0; j<2; j++)
{
sqi[j][i] = sq[k];
k++;
}
}
for(i=0; i<4; i++)
iV[i] = 0;
for(i=0; i<M; i++)
{
for(j=0; j<4; j++)
{
if((sqi[0][i] == pairs[0][j])&&(sqi[1][i] == pairs[1][j]))
iV[j]++;
}
}
cout<<"Chislo sovpadenii par: "<<"\n";
for(i=0; i<4; i++)
{
cout<<iV[i]<<"\n";
}
// вычисляем хи-квадрат статистику
itmp = (double)M/n;
for(j=0; j<4; j++)
hi_kv = hi_kv + pow((iV[j] - itmp),2)/itmp;
cout<<"Statistika hi-kvadrat : "<<hi_kv<<" ";
for(i=0; i<15; i++)
{
if(table_hi[0][i] == (1-alfa))
{
if(table_hi[1][i] > hi_kv)
cout<<"\nPrinimaem gipotezy o raspredelenii na yrovne znachimossti alfa = 5%\n";
else
cout<<"\nOtvergaem gipotezy o raspredelenii\n";
}
}
return 0;
}
Обобщенный статистический тест Маурера.
int main()
{
int L = 8;
int Q = 1500;
int K = 128000;
int N;
int i,j,k,count;
int *sq,*A,**y;
//int y[129500][8];
double eps = 0.05; // уровень значимости теста 5%
double Feps = 1.960; // квантиль уровня eps/2
double t1, t2;
double Funi,mt_t,mt,C,D,D_t,sigma;
char* file_name = "SQ_rsa.txt";
FILE *in;
in=fopen(file_name,"r");
if(in==NULL )
printf("\nIncorrect input file\n");
N = (Q+K)*L;
sq = new int[N];
for(i=0; i<N; i++)
fscanf(in,"%d",&sq[i]);
// Вычисляем Ai
k = 0;
y = new int*[8];
y[0] = new int[K+Q];
y[1] = new int[K+Q];
y[2] = new int[K+Q];
y[3] = new int[K+Q];
y[4] = new int[K+Q];
y[5] = new int[K+Q];
y[6] = new int[K+Q];
y[7] = new int[K+Q];
for(i=0; i<Q+K; i++)
{
for(j=0; j<8; j++)
{
y[j][i] = sq[k];
k++;
}
}
A = new int[N];
for(i=Q+1; i<Q+K+1; i++)
{
for(j=i-1; j>=0; j--)
{
count = 0;
for(k=0; k<8; k++)
{
if(y[k][j] == y[k][i])
count++;
if(count == 8)
A[i] = i-j;
else
A[i] = i;
}
if(count == 8)
break;
}
}
// Вычисляем статистику
Funi = 0;
for(i = Q+1; i<Q+K+1; i++)
Funi = Funi + log(A[i])/(K*log(2));
cout<<"Statistica(mera sgimaemosti): "<<Funi;
// Мат. ожидание
mt_t = 0;
mt = 0;
for(i=1; i<Q+1; i++)
{
mt_t = pow((1 - pow(2,(-1)*L)),(i-1))*log(i)/log(2);
mt = mt + mt_t;
}
mt = mt*pow(2,(-1)*L);
cout<<"\nMatematicheskoe ogidanie: "<<mt;
//Дисперсия
C = 0.6; // для K>>2^L С близко к 0,6 для L = 8;
D = 0;
D_t = 0;
for(i=1; i<Q+1; i++)
D_t = D_t + pow((1-pow(2,(-1)*L)),(i-1))*pow(log(i)/log(2),2);
D_t = D_t*pow(2,(-1)*L);
D = D_t - pow(mt,2);
sigma = sqrt(D/K)*C;
cout<<"\nSrednekvadraticheskoe otklonenie: "<<sigma;
t1 = mt + sigma*Feps;
t2 = mt - sigma*Feps;
if((Funi > t2)&&(Funi < t1))
cout<<"\nPrinimaem gipotezy o raspredelenii na yrovne znachimosti 5%.\n";
else
cout<<"\n Otvergaem gipotezy. ";
cout<<"\nInterval [t2 t1]"<<"["<<t2<<" "<<t1<<"]";
return 0;
}
Критерий серий
int main()
{
int i,iSeries,n1,n2;
int N=500; // размер последовательности
int *sq;
double eps = 0.05;
double Up = 1.960;
double Zv,tmp,tmp2,tmp3;
sq = new int[N];
char* file_name = "SQ_2shift.txt";
FILE *in;
in=fopen(file_name,"r");
if(in==NULL )
printf("\nIncorrect input file\n");
for(i=0; i<N; i++)
{
fscanf(in,"%d",&sq[i]);
}
cout<<"SQ: ";
for(i=0; i<N; i++)
cout<<sq[i]<<" ";
iSeries = 0;
for(i=1; i<N+1; i++)
{
if(sq[i] == sq[i-1])
continue;
else
iSeries++;
}
n1 = 0;
n2 = 0;
for(i=0; i<N; i++)
{
if(sq[i] == 0)
n1++;
else
n2++;
}
cout<<"\nKolichestvo serii: "<<iSeries;
cout<<"\n";
cout<<"\n kolichestvo 0: "<<n1;
cout<<"\n";
cout<<"\n kolichestvo 1: "<<n2;
cout<<"\n";
tmp = 2*n1*n2/pow((n1+n2),2);
tmp2 = (double)iSeries - (double)2*n1*n2/(n1+n2) - 1;
if(tmp2 > 0)
tmp3 = tmp2;
else
tmp3 = tmp2*(-1);
Zv = (tmp3 - 0.5)/sqrt((tmp*((double)2*n1*n2 - (double)(n1 + n2))/(n1+n2-1)));
cout<<"Statistica test: "<<Zv;
if(Zv < Up)
cout<<"\nPrinimaem gipotezy o raspredelenii.\n";
else
cout<<"Otvergaem gipotezy\n";
return 0;
}
Список использованной литературы
1. Харин Ю.С., Берник В.И., Матвеев Г.В., Агиевич С.В. "Математические и компьютерные основы криптологии" - Мн.: Новое знание, 2003
2. Евтушенко Ю.Г., Мазурик В.П. "Программное обеспечение систем оптимизации" - М.: Знание, 1989
3. Белов А.А., Баллод Б.А., Елизарова Н.Н. "Теория вероятностей и математическая статистика" - Ростов н/Д: Феникс, 2008.
4. Нечаев А.А. "Мультирегистры сдвига и сложность мультипоследовательностей",Труды по дискретной математике - М: Физматлит, 2003 - Т.6.
5. Ефимов А.В., Поспелов А.С., Земсков В.Н "Сборник задач по математике для ВТУЗОВ", ч.4 - М: Физматлит, 2004
6. Кнут Д.Э. "Искусство программирования", т.2 - М.: "Вильямс", 2007
7. Лидл Р., Нидеррайтер Г. "Конечные поля" - М.: Мир, 1988.
8. Ивченко Г.И., Медведев Ю.И. "Математическая статистика", - М: "Высшая школа", 1984
Размещено на Allbest.ru
Подобные документы
Обобщенные циклотомические последовательности. Цикломатические числа и их свойства. Метод расчета линейной сложности обобщенных циклотомических последовательностей. Примеры вычисления линейной сложности двоичных последовательностей с периодами.
курсовая работа [797,5 K], добавлен 13.06.2013Рассмотрение некоторых числовых последовательностей, заданных рекуррентно, их свойств и задач с ними связанных. Теория возвратных последовательностей. Свойства последовательности Фибоначчи и ее золотое сечение. Исследование последовательности Каталана.
реферат [812,1 K], добавлен 03.05.2015Способы получения псевдослучайных чисел. Общая характеристика генератора псевдослучайных чисел фон Неймана. Сущность равномерного закона распределения. Понятие о критериях согласия. Анализ критериев Пирсона и Колмогорова.
курсовая работа [176,9 K], добавлен 28.04.2010Понятие математического моделирования: выбор чисел случайным образом и их применение. Критерий частот, серий, интервалов, разбиений, перестановок, монотонности, конфликтов. Метод середины квадратов. Линейный конгруэнтный метод. Проверка случайных чисел.
контрольная работа [55,5 K], добавлен 16.02.2015Математическое обоснование алгоритма вычисления интеграла. Принцип работы метода Монте–Карло. Применение данного метода для вычисления n–мерного интеграла. Алгоритм расчета интеграла. Генератор псевдослучайных чисел применительно к методу Монте–Карло.
курсовая работа [100,4 K], добавлен 12.05.2009Понятие и история формирования категории "последовательность", ее значение в современной математике. Свойства и аналитическое задание последовательности, роль в развитии других областей знания. Решение задач на вычисление пределов последовательностей.
презентация [665,0 K], добавлен 17.03.2017Члены последовательности и их изображение на числовой оси. Виды последовательностей (ограниченная, возрастающая, убывающая, сходящаяся, расходящаяся), их практические примеры. Определение и геометрический смысл предела числовой последовательности.
презентация [78,9 K], добавлен 21.09.2013Вычисление математических последовательностей и определение числа, которое называется пределом последовательности. Методы расчетов предела функции. Произведение бесконечно малой функции и ограниченной функции. Определение предела последовательности.
контрольная работа [114,0 K], добавлен 17.12.2010Сходимость последовательностей случайных величин и вероятностных распределений. Метод характеристических функций. Проверка статистических гипотез и выполнение центральной предельной теоремы для заданных последовательностей независимых случайных величин.
курсовая работа [364,8 K], добавлен 13.11.2012Понятие возрастающей числовой последовательности. Формула бинома Ньютона. Число положительных слагаемых. Определение ограниченности последовательности чисел. Предел монотонной и ограниченной последовательностей. Показательный рост или убывание.
презентация [87,1 K], добавлен 21.09.2013