예제 #1
0
파일: largeNum.cpp 프로젝트: KrIstiRA/RSA
bigInt powMod(bigInt base, bigInt exp, bigInt modul)
{
    // возведение base в степень exp по модулю modul
    // используется алгоритм быстрого возведения в степень
	bigInt res = createFromInt(1); // сюда будет записан результат
	bigInt zero = createFromInt(0);
    bigInt two = createFromInt(2);
    bigInt b = copy(exp);
    bigInt a = copy(base);

    while (compare(b, zero) > 0)
	{
        if (odd(b))
        {
            // res = (res * a) % modul;
            // tmp = res * base
            bigInt tmp = mul(res, a);

            // res = tmp % modul
            bigInt modRem; // сюда запишем остаток от деления
            bigInt tmp2 = dividing(tmp, modul, &modRem);
            free(tmp2.digits);
            free(tmp.digits);
            free(res.digits);
            res = modRem;
        }
        // a = (a*a) % modul
        bigInt tmp = mul(a, a);
        free(a.digits);

        bigInt modRem; // сюда запишем остаток от деления
        bigInt tmp2 = dividing(tmp, modul, &modRem);
        free(tmp2.digits);
        free(tmp.digits);
        a = modRem;

        // b = b /2
        tmp = dividing(b, two, &modRem);
        free(b.digits);
        free(modRem.digits);
        b = tmp;
	}
	// очищаем память
    free(b.digits);
    free(zero.digits);
    free(two.digits);
	return res;
}
예제 #2
0
long_class long_class::operator%(long_class &right)
{
	long_class ost;
	long_class res;
	res.me = dividing(this->me, right.me, &ost.me);
	return ost;
}
예제 #3
0
int main ( int argc, char * argv [ ] )
{
	int number ;

	printf ( "Give me a number : " ) ;
	scanf ( "%d", & number ) ;
	printf ( "F ( %d ) = %d\n", number, dividing ( number ) ) ;
	return 0 ;
}
예제 #4
0
파일: largeNum.cpp 프로젝트: KrIstiRA/RSA
int saveTobinarFile(const char* filename, bigInt A)
{
	// будем считать, что в бинарный файл необходимо записать число по основанию 256
	// то есть необходимо перейти от BASE к 256 (256 - потому что максимальное значение байта - 255)
	// для этого надо находить остатки от деления на 256
	// пока число не уменьшиться до 0
	// возвращаем 0 в случае успешной записи
	// не 0 - в случае ошибки

	FILE* pfDestination = fopen(filename, "w+b");
	if (!pfDestination)
		return 1;

	struct bigInt tmp = copy(A); // число, которое будем делить на 256
	tmp.sign = 0; // не будем обращать внимания на знак
	bigInt zero = createFromInt(0);
	bigInt b256 = createFromInt(256);

	// пока число не станет равным 0
	while (compare(tmp, zero) != 0)
	{
		bigInt ost; // куда будет записан остаток от деления на 256

		// tmp = tmp / 256
		bigInt tmp2 = dividing(tmp, b256, &ost);
		free(tmp.digits);
		tmp = tmp2;

		// теперь в ost очередной остаток от деления на 256
		// запишем его в файл

		fwrite((char*)&ost.digits[0], sizeof(unsigned char), 1, pfDestination);
		free(ost.digits);
	}

	free(tmp.digits);
	free(b256.digits);
	free(zero.digits);

	fclose(pfDestination);
	return 0;
}
예제 #5
0
파일: main.c 프로젝트: Shcoda/TCHMK_1
int main(int argc, char* argv[])
{
	char *file1 = argv[1];
	char *file2 = argv[3];
	char *file3 = argv[4];
	char *file4 = NULL;
	char op = argv[2][0];
	int bin = 0;
	struct bNum n, m, md;

	if (argc == 6)
	{
		if (!strcmp(argv[5], "-b"))
			bin = 1;
		else
			file4 = argv[5];
	}

	if (argc == 7)
	{
		bin = 1;
		file4 = argv[6];
	}

	if (bin == 1)
	{
		n = ReadFromBFile(file1);
		m = ReadFromBFile(file2);
		if (file4 != NULL)
			md = ReadFromBFile(file4);
	}
	else
	{
		n = ReadFromTFile(file1);
		m = ReadFromTFile(file2);
		if (file4 != NULL)
			md = ReadFromTFile(file4);
	}

	struct bNum k;
	k.size = 0;
	k.sign = 0;
	k.nums = NULL;
	if (argv[2][0] == '+')
		k = Sum1(n, m);

	if (argv[2][0] == '-')
	{
		struct bNum minusB = mins(m);
		k = Sum1(n, minusB);
		free(minusB.nums);
	}

	if (argv[2][0] == '*')
		k = mul(n, m);

	if (argv[2][0] == '/')
	{
		struct bNum q;
		k = dividing(n, m, &q);
		free(q.nums);
	}

	if (argv[2][0] == '%')
	{
		struct bNum q = dividing(n, m, &k);
		free(q.nums);
	}

	if (file4 != NULL)
	{
		struct bNum tmp;
		struct bNum q = dividing(k, md, &tmp);
		free(q.nums);
		free(k.nums);
		k = tmp;
	}

	if (argv[2][0] == '^')
	{
		if (file4 == NULL)
			k = pPow(n, m);
		else
			k = powMod(n, m, md);
	}

	if (bin == 1)
		WriteToBFile(file3, k);
	else
		WriteToTFile(file3, k);

	free(n.nums);
	free(m.nums);
	free(k.nums);
	if (file4 != NULL)
		free(md.nums);

	return 0;
}
예제 #6
0
int main() {

	printf("Start....");
start:

	printf("\n(input) ");			//계산기 프로그램 시작

	input();

	error();

	if(again == 1)
	{
	initialization();
		goto start;
	}

	c_hoice();

	if (chosen != 1){    //in1에 입력받은 문자가 1자리 대소문자가 아닌 경우

		var_cal();
		if (var_cal_switch == 1)
		{
			printf("        = error\n");
			initialization();
			goto start;
		}

		check_sign_in1();   // input1 +/- 부호 체크
		check_sign_in3();   // input3 +/- 부호 체크
		re_array_in1();     // 다항 연산 고려  순서 바꿔 저장
		re_array_in3();     // 다항 연산 고려  순사 바꿔 저장
		separate();

		which_sign();


		switch (in2[0]) 				{		

			case '+' : { invert1(); convert1(); plus(); convert2(); invert2(); break; }
			case '-' : { invert1(); compare(); convert1(); minus(); convert2(); invert2(); break; }
			case '*' : { invert1(); invert1_mul_s();  multiply(); invert2(); invert2_mul_s(); break;  }
			case '/' : { dividing(); break; }
			case '%' : { remain2(); break; }

			default: ;
		}	

		printf("        = ");

		if(when_put_minus == 1)
			printf("-");	


		if (daeso == 1)
			printf("-");
		comma(res_j);
		if (p != 0)
		{printf(".");
			comma(res_s);}					

	}

	initialization();

	goto start;

	return 0;
}
예제 #7
0
파일: debug.c 프로젝트: jaeho93/cal_project
int main() {

	printf("Start....");
start:

	printf("\n(input) ");			//계산기 프로그램 시작

	input();

	c_hoice();

	if (chosen != 1){

		var_cal();


		check_sign_in1();
		check_sign_in3();
		re_array_in1();
		re_array_in3();

		separate();


		if(in2[0] == '-'){
			if(minus_sign_count == 0)
				in2[0] = '-';
			else if(minus_sign_count == 1){
				if(if_minus_first == 1){
					in2[0] = '+';
					when_put_minus =1;}
				if(if_minus_last == 1)
					in2[0] = '+';}
			else{
				in2[0] = '-';}}


		else if(in2[0] == '+'){
			if(minus_sign_count == 0)
				in2[0] = '+';
			else if(minus_sign_count == 1){
				if(if_minus_first == 1)
					in2[0] = '-';
				if(if_minus_last == 1)
					in2[0] = '-';}
			else{ 
				in2[0] = '+';
				when_put_minus=1;}}


		else if(in2[0] == '*'){
			if(minus_sign_count == 0 || minus_sign_count == 2)
				in2[0] = '*';
			else if(minus_sign_count == 1){
				in2[0] = '*';	
				when_put_minus=1;}}

		else if(in2[0] == '/'){
			if(minus_sign_count == 0 || minus_sign_count == 2)
				in2[0] = '/';
			else if(minus_sign_count == 1){
				in2[0] = '/';	
				when_put_minus=1;}}

		else if(in2[0] == '%'){
			if(minus_sign_count == 0 || minus_sign_count == 2){
				if(if_minus_first == 1){
					in2[0] = '%';
					when_put_minus = 1;}

				else
					in2[0] = '%';}

			else if(minus_sign_count == 1){
				if(if_minus_first == 1){
					in2[0] = '%';
					when_put_minus = 1;}

				else
					in2[0] = '%';}}



		switch (in2[0]) 				{		

			case '+' : { invert1(); convert1(); plus(); convert2(); invert2(); break; }
			case '-' : { invert1(); compare(); convert1(); minus(); convert2(); invert2(); break; }
			case '*' : { invert1(); invert1_mul_s();  multiply(); invert2(); invert2_mul_s(); break;  }
			case '/' : {printf("지호 "); dividing();  convert2(); break; }

			case '%' : { invert1(); compare(); convert1(); remain(); convert2(); invert2(); break; }

			default: ;
		}	

		printf("        = ");

		if(when_put_minus == 1)
			printf("-");	
		//	if(when_remove_minus == 1)
		//여기서 - 부호 하나를 배열에서 빼주는 명령어 쓸 수 없을까?


		if (daeso == 1)
			printf("-");
		comma(res_j);
		if (p != 0)
		{printf(".");
			comma(res_s);}					

	}

	initialization();

	goto start;

	return 0;
}