/* Program Fermat's factorisation algorithm to factor any odd n into two factors.
Code it as a function with argument n. Show your code.*/
#include <stdio.h>
//#include <conio.h>
#include <math.h>
int FERMAT_factors_oddonly (int y);
bool Check_square (int z);
int main (){
long int g;
printf("Please input ODD integer:\n");
scanf("%ld",&g);
FERMAT_factors_oddonly(g);
getch();
}
int FERMAT_factors_oddonly (int n){
int a=0;
double B; // B = b*b;
a = ceil (sqrt (n));
B = (a*a) - n;
printf("\nINPUT NUMBER: %d\n",n);
int c = 0;
while (!Check_square(B)){
B = pow((a+c),2) - n;
printf(" \n ::: Finding B ::: \n");
printf("( %d + %d )^2 - %d = %.2f\n",a,c,n,B);
switch (Check_square(B)){
case 0: printf(" \n %.2f is NOT a perfect square !!!\n",B);
break;
case 1: printf(" \n %.2f IS A PERFECT SQUARE \\: BINGO :/ \n", B);
break;
}
printf("\n");
//getch(); // step by step user observe output
c++;
}
if (c!=0) c--; // to ensure the c value doesn't increased after the last run for one time factorisation
long int factrA, factrB;
factrA = a+c;
factrB = sqrt(B);
printf("FULL EQUATION ::: N = (a)^2 - (b)^2\n",n,factrA,factrB);
printf("%19d = (%d)^2 - (%d)^2\n",n,factrA,factrB);
printf("Thus, value of a = %d, b = %d\n\n",factrA,factrB);
printf("::: The factors are ::: ( %d + %d ) and ( %d - %d )",factrA,factrB,factrA,factrB );
printf(" = ( %d ) and ( %d )",factrA+factrB,factrA-factrB );
}
bool Check_square (int z){
if ((sqrt(z)*sqrt(z)) == z || ((sqrt(z)+1)*(sqrt(z)+1) == z))
return 1;
}
LyogUHJvZ3JhbSBGZXJtYXQncyBmYWN0b3Jpc2F0aW9uIGFsZ29yaXRobSB0byBmYWN0b3IgYW55IG9kZCBuIGludG8gdHdvIGZhY3RvcnMuIApDb2RlIGl0IGFzIGEgZnVuY3Rpb24gd2l0aCBhcmd1bWVudCBuLiBTaG93IHlvdXIgY29kZS4qLwoKI2luY2x1ZGUgPHN0ZGlvLmg+Ci8vI2luY2x1ZGUgPGNvbmlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgoKCmludCBGRVJNQVRfZmFjdG9yc19vZGRvbmx5IChpbnQgeSk7CmJvb2wgQ2hlY2tfc3F1YXJlIChpbnQgeik7CgoKaW50IG1haW4gKCl7CmxvbmcgaW50IGc7CglwcmludGYoIlBsZWFzZSBpbnB1dCBPREQgaW50ZWdlcjpcbiIpOwoJc2NhbmYoIiVsZCIsJmcpOwoJCglGRVJNQVRfZmFjdG9yc19vZGRvbmx5KGcpOwoJCglnZXRjaCgpOwp9CgppbnQgRkVSTUFUX2ZhY3RvcnNfb2Rkb25seSAoaW50IG4pewoJaW50IGE9MDsKCWRvdWJsZSBCOyAvLyBCID0gYipiOwoJYSA9IGNlaWwgKHNxcnQgKG4pKTsKCUIgPSAoYSphKSAtIG47CgoJcHJpbnRmKCJcbklOUFVUIE5VTUJFUjogJWRcbiIsbik7CgkKICAgIGludCBjID0gMDsKCSAgICAgICAgICAgICAgCgl3aGlsZSAoIUNoZWNrX3NxdWFyZShCKSl7CgkJCgkJQiA9IHBvdygoYStjKSwyKSAtIG47CgkJCgkJcHJpbnRmKCIgXG4gOjo6IEZpbmRpbmcgQiA6OjogXG4iKTsKCQlwcmludGYoIiggJWQgKyAlZCApXjIgLSAlZCA9ICUuMmZcbiIsYSxjLG4sQik7CgkJCgkJc3dpdGNoIChDaGVja19zcXVhcmUoQikpewoJCQljYXNlIDA6IHByaW50ZigiIFxuICUuMmYgaXMgTk9UIGEgcGVyZmVjdCBzcXVhcmUgISEhXG4iLEIpOwoJCQkJCWJyZWFrOwoJCQljYXNlIDE6IHByaW50ZigiIFxuICUuMmYgSVMgQSBQRVJGRUNUIFNRVUFSRSBcXDogQklOR08gOi8gXG4iLCBCKTsKCQkJCQlicmVhazsKCQl9CgkJcHJpbnRmKCJcbiIpOwoJCS8vZ2V0Y2goKTsgLy8gc3RlcCBieSBzdGVwIHVzZXIgb2JzZXJ2ZSBvdXRwdXQKCQljKys7Cgl9CgppZiAoYyE9MCkgYy0tOyAvLyB0byBlbnN1cmUgdGhlIGMgdmFsdWUgZG9lc24ndCBpbmNyZWFzZWQgYWZ0ZXIgdGhlIGxhc3QgcnVuIGZvciBvbmUgdGltZSBmYWN0b3Jpc2F0aW9uCgpsb25nIGludCBmYWN0ckEsIGZhY3RyQjsKCmZhY3RyQSA9IGErYzsKZmFjdHJCID0gc3FydChCKTsKCnByaW50ZigiRlVMTCBFUVVBVElPTiA6OjogTiA9IChhKV4yIC0gKGIpXjJcbiIsbixmYWN0ckEsZmFjdHJCKTsKcHJpbnRmKCIlMTlkID0gKCVkKV4yIC0gKCVkKV4yXG4iLG4sZmFjdHJBLGZhY3RyQik7CnByaW50ZigiVGh1cywgdmFsdWUgb2YgYSA9ICVkLCBiID0gJWRcblxuIixmYWN0ckEsZmFjdHJCKTsKcHJpbnRmKCI6OjogVGhlIGZhY3RvcnMgYXJlIDo6OiAoICVkICsgJWQgKSBhbmQgKCAlZCAtICVkICkiLGZhY3RyQSxmYWN0ckIsZmFjdHJBLGZhY3RyQiApOwpwcmludGYoIiA9ICggJWQgKSBhbmQgKCAlZCApIixmYWN0ckErZmFjdHJCLGZhY3RyQS1mYWN0ckIgKTsKCgp9Cgpib29sIENoZWNrX3NxdWFyZSAoaW50IHopewoKaWYgKChzcXJ0KHopKnNxcnQoeikpID09IHogfHwgKChzcXJ0KHopKzEpKihzcXJ0KHopKzEpID09IHopKQoKcmV0dXJuIDE7CgkKfQo=
MDMzMDNiNzkwZmIxNDlkYTM0MDZkNDk1YWI5YjlmYjhhOWUyOTM0NDVlM2JkNDNiMThlZjJmMDUyMWI3MjZlYmU4ZDgzOGJhNzc0YmI1MjQwZjA4ZjdmYmNhMGExNDJhMWQ0YTYxZWE5NzMyOTRlNjg0YThkMWEyY2RmMThhODRmMmRiNzA5OWI4ZTk3NzU4OGIwYjg5MTI5MjU1OGNhYTA1Y2Y1ZGYyYmM2MzM0YzVlZTUwODNhMjM0ZWRmYzc5YTk1YzQ3OGE3OGUzMzdjNzIzYWU4ODM0ZmI4YTk5MzFiNzQ1MDNmZmVhOWU2MWJmNTNkODcxNjk4NGFjNDc4Mzdi
03303b790fb149da3406d495ab9b9fb8a9e293445e3bd43b18ef2f0521b726ebe8d838ba774bb5240f08f7fbca0a142a1d4a61ea973294e684a8d1a2cdf18a84f2db7099b8e977588b0b891292558caa05cf5df2bc6334c5ee5083a234edfc79a95c478a78e337c723ae8834fb8a9931b74503ffea9e61bf53d8716984ac47837b