⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prim.cpp

📁 Testprogram for the quality of PseudoRandomNumber Generators
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// prim.cpp : Definiert den Einsprungpunkt f黵 die Konsolenanwendung.
//

#include "stdafx.h"
#include <math.h>
#include <string.h>
#include <stdio.h>


#define	PXXGLOBAL 
#define	SHIFT		10


unsigned Ende;

unsigned long SerialYourVar;
unsigned long PrimeNumber, PrimeOffset;

unsigned long DoubleSerialYourVar[2];

union {
	unsigned short WordFastSerialYourVar[2];
	unsigned char CharFastSerialYourVar[4];
} Fast;
short unsigned FirstFastPrimeNumber;
short unsigned SecondFastPrimeNumber;

#define	MAX_TEST		0x4000
#define	MAX_TEST_MASK	0x3fff

unsigned long TestArray[MAX_TEST];

PXXGLOBAL void RandomTest(FILE *wp, unsigned long num, unsigned long offset);
PXXGLOBAL void rechne(void);
PXXGLOBAL void SerialRandomOne(void);

PXXGLOBAL void SerialRandomTwo(void);
PXXGLOBAL void FastRandomTest(FILE *wwp,unsigned long number);

PXXGLOBAL void FirstFastSerialRandom(void);
PXXGLOBAL void SecondFastSerialRandom(void);


#define	DOUBLE_FAST_OFFSET1		0x73734123L
#define	DOUBLE_FAST_OFFSET2		0x10347323L


PXXGLOBAL int main(int argc, char* argv[])
{
	printf("Hallo Welt!\n");
	rechne();
	return 0;
}





PXXGLOBAL void rechne(void)
{
	FILE *wp;

	unsigned long zahl;
	unsigned long i;
	unsigned long bruch;
	int zwei = 0;
	int stueck = 0;
	unsigned long ezahl;
	unsigned long azahl;
	unsigned long offset;
	double val;
	unsigned long MaxZahl;
	int mode=4;

	printf("PRIM.EXE %s %s",__DATE__,__TIME__);


	switch (mode) {
	case 0:
		azahl = 1103515245L - 100;
		ezahl = 1103515245L + 100;
		offset = 0x1234;
		break;

	case 1:	azahl = 10000000L;
			ezahl = 10005000L;
			offset = 0x1234;
			break;

	case 2:	azahl = 0x80000000L-0x10000L;
			ezahl = 0x80000000L;
		offset = 0x1234;
		break;

	case 4:
		azahl = 0xff00;
		ezahl=0xffff;
		offset = 0x1234;
		break;

		}
/****************************************************************************
Hallo Welt!
PRIM.EXE Dec 31 2005 07:28:33
Primzahlen von  00008000  bis 0000ffff  00001234 sind: 
	ZAHL        32769 teilbar            3
      32771 00008003 Max 000000b5        181 1.810276e+002 
RandomNumber 8003 Cycle        32768
	ZAHL        32773 teilbar           13
	ZAHL        32775 teilbar            3
	ZAHL        32777 teilbar           73
      32779 0000800B Max 000000b5        181 1.810497e+002 
RandomNumber 800b Cycle        32768
	ZAHL        32781 teilbar            3
      32783 0000800F Max 000000b5        181 1.810608e+002 
RandomNumber 800f Cycle         8192
	ZAHL        32785 teilbar            5
	ZAHL        32787 teilbar            3
      32789 00008015 Max 000000b5        181 1.810773e+002 
RandomNumber 8015 Cycle        65536
	ZAHL        32791 teilbar           11
	ZAHL        32793 teilbar            3
	ZAHL        32795 teilbar            5
      32797 0000801D Max 000000b5        181 1.810994e+002 
RandomNumber 801d Cycle        65536
	ZAHL        32799 teilbar            3
      32801 00008021 Max 000000b5        181 1.811105e+002 
RandomNumber 8021 Cycle        65536
      32803 00008023 Max 000000b5        181 1.811160e+002 
RandomNumber 8023 Cycle        32768
****************************************************************************/

	printf("\nPrimzahlen von  %08lx  bis %08lx  %08lx sind: ", azahl, ezahl, offset);

   /*
    * Z鋒lerschleife des Bereichs
    */

	for (zahl = azahl; zahl < ezahl; zahl++) {
		zwei = 0;

	   /*
	    * Divisor festlegen
		*/

		val =sqrt((double)zahl);
		MaxZahl=(long)(val*1.001);

		if ((zahl & 1) == 1) {
			for (i = 2; i < MaxZahl && zwei <= 1; i++) {
				bruch = zahl % i;

			   /*
			    * Wenn bruch=0 ist, wird zwei um 1 erh鰄t
			    */

				if (bruch == 0) {
					printf("\n\tZAHL %12lu teilbar %12lu",zahl,i);
/*					fprintf(wp,"\n\tZAHL %12lu teilbar %12lu",zahl,i);	*/
					zwei = zwei + 1;
					break;
				}
			}

		   /*
		    * Wenn beim letzten Durchlauf zwei=1 ist, dann ist es eine Primzahl
		    * und wird ausgegeben
		    */

			if (zwei == 0) {
				printf("\n %10lu %08lX Max %08lx sqrt==%10lu %8.6e ", zahl,zahl,MaxZahl,MaxZahl,val);

				wp = fopen("PRIM.TXT","at");
				fprintf(wp,"\n %10lu %08lX Max %08lx sqrt==%10lu %8.6e ", zahl,zahl,MaxZahl,MaxZahl,val);
				stueck ++;
				switch (mode) {
				default:
					RandomTest(wp,zahl, 0x7373);		// 0x73734123L
					break;

				case 4:
					FastRandomTest(wp,zahl);
					break;
				}
				fclose(wp);
			}
		}
		if (Ende) {
				break;
		}
	}


	fclose(wp);
}

#define	FAST_PRIME				0x7FFF00AB


PXXGLOBAL void RandomTest(FILE *wwp,unsigned long number, unsigned long offset)
{
	long cnt=0;
	long iicnt=0;
	__int64 longcnt=0;
	double val;
	int endeloop=0;

	PrimeNumber= number;					//	2147418487UL
//	PrimeNumber = 0x7FFF0013;
	PrimeOffset = offset;					// 0x73734123L;
	long testcount=0;
#define	START_VALUE			0x432423	
#define	START2_VALUE		0x3456342
	DoubleSerialYourVar[0]=SerialYourVar=START_VALUE;
	DoubleSerialYourVar[1]= START2_VALUE;
	memset(TestArray,0x00,sizeof(TestArray));

	FILE *pp;
	pp=fopen("MASK.TXT","wa");
	testcount=0;

	fprintf(pp,"\r\n %08lx  %12lu",PrimeNumber,PrimeOffset);
	SerialRandomOne();

	do {
/*		if (testcount<5000) {
				fprintf(pp,"\n%08X %06u",SerialYourVar,(SerialYourVar>>SHIFT)&MAX_TEST_MASK);
		}
*/
		SerialRandomOne();
		SerialRandomTwo();
		TestArray[(SerialYourVar>>SHIFT)&MAX_TEST_MASK]++;
		cnt++;
		testcount++;
		longcnt++;
//		iicnt++;

		if (DoubleSerialYourVar[0]==START_VALUE && DoubleSerialYourVar[1]==START2_VALUE) {
				endeloop++;
		}

	} while (endeloop==0);	// cnt <0x10000000 &&

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -