/** * @Comment: WSU - Fall 06 - CS 3830-0 * @Title: prj4b.c - Project 4 * @Author: Vincenzo Maggio */ #include #include #include #include #include #define p 1783 /*1753 /* 1123 */ #define q 1979 /* 1151 */ #define s 31571 /*15731 /*21597 /*23531 /*23911 /*24919 33013 39157*/ int main( void) { char cArray[20000]; int iPoker[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; unsigned long long primer = 0, LLResult = 0; unsigned long lResult = 0; double dPoker; int iRun[2][6] = { 0,0,0, 0,0,0, 0,0,0, 0,0,0 }; int N, j, onesCounter, iTempTot, iRunCounter, iDir, maxzeroes, maxones; char cPrevValue; system("cls"); system("color f0"); gotoxy( 29, 2); printf("CS 3830 - Project 4 part b\n\n"); printf(" Generating...\n\n"); memset( cArray, 0, 20000); /* generation */ N = p * q, primer = ( s * s) % N; for ( j = 0; j < 20000; j++ ) { LLResult = primer % N, primer = LLResult * LLResult; onesCounter = 0; while ( LLResult ) { if ( LLResult % 2) ++onesCounter; LLResult = LLResult >> 1; } if ( onesCounter % 2 ) cArray[j] = 1; else cArray[j] = 0; } /* Test #1 - The Monobit Test */ printf(" 1. The Monobit Test\t\t"); onesCounter = 0; for ( j = 0; j < 20000; j++ ) if ( cArray[j] ) ++onesCounter; if ( 9654 < onesCounter && onesCounter < 10346 ) printf("Counter = %d, passed", onesCounter); else printf("Counter = %d, failed", onesCounter); /* Test #2 - The Poker Test */ printf("\n 2. The Poker Test\t\t"); for ( j = 0; j < 20000; j += 4) { iTempTot = 0; if ( *( cArray + j ) ) iTempTot += 8; if ( *( cArray + j + 1 ) ) iTempTot += 4; if ( *( cArray + j + 2 ) ) iTempTot += 2; if ( *( cArray + j + 3 ) ) iTempTot += 1; ++iPoker[iTempTot]; } lResult = 0; for ( j = 0; j < 16; j++ ) lResult += (iPoker[j] * iPoker[j]); dPoker = (( 16.000 / 5000.000 ) * (double) lResult) - 5000.000; if ( 1.0300 < dPoker && dPoker < 57.400 ) printf( "X = %f, passed", dPoker ); else printf( "X = %f, failed", dPoker); /* Test #3 - The Runs Test */ printf("\n 3. The Runs Test\t\tZeroes\t\tOnes\n"); iDir = cPrevValue = *cArray; iRunCounter = 1; for ( j = 1; j < 20000; j++ ) { if ( cArray[j] == cPrevValue ) { ++iRunCounter; } else { if ( iRunCounter >= 6 ) { ++iRun[iDir][5]; } else ++iRun[iDir][iRunCounter-1]; iRunCounter = 1; cPrevValue = !cPrevValue; iDir = !iDir; } } printf("\t1\t2267-2733\t%d\t\t%d\n", iRun[0][0], iRun[1][0] ); printf("\t2\t1079-1421\t%d\t\t%d\n", iRun[0][1], iRun[1][1] ); printf("\t3\t502-748\t\t%d\t\t%d\n", iRun[0][2], iRun[1][2] ); printf("\t4\t223-402\t\t%d\t\t%d\n", iRun[0][3], iRun[1][3] ); printf("\t5\t90-223\t\t%d\t\t%d\n", iRun[0][4], iRun[1][4] ); printf("\t6+\t90-223\t\t%d\t\t%d\n", iRun[0][5], iRun[1][5] ); iTempTot = 0; for ( iDir = 0; iDir < 2; iDir++ ) for ( j = 0; j < 6; j++ ) iTempTot += iRun[iDir][j]; printf("\ttot\t%d", iTempTot); /* Test #4 - The Long Run Test */ printf("\n 4. The Long Run Test\t"); cPrevValue = *cArray; iRunCounter = 1; maxzeroes = maxones = 0; for ( j = 1; j < 20000; j++ ) { if ( cArray[j] == cPrevValue ) { ++iRunCounter; } else { if ( cArray[j] ) { if ( iRunCounter > maxones ) maxones = iRunCounter; } else { if ( iRunCounter > maxzeroes ) maxzeroes = iRunCounter; } iRunCounter = 1; cPrevValue = !cPrevValue; } } printf("\tmax 0 = %d\tmax 1 = %d", maxzeroes, maxones); if ( maxzeroes < 34 && maxones < 34 ) printf(", passed"); else printf(", failed"); printf("\n\n "); system("pause"); system("color 0f"); return 0; } /* niam */