/* recuct.c reduction des fractions
 *
 long long int
        strtoll(const char *nptr, char **endptr, int base);
	
	compilation :
	gcc -o reduct reduct.c

	usage :
	reduct 1234 / 762

	usage :
        reduct 1234  762
	La fraction 1234 / 762 peut être simplifiée par 2
	617 / 381 est la fraction réduite.
 * */

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[0]) {
	long long x, y, u, v, w, a, b, signe = 1LL;
	if(argc<3) {
		printf( "usage : %s x y\n"
			"ou %s x / y\n",
			argv[0]);
		printf("Les valeurs extrêmes des entiers sont définies dans le fichier\n"
			"/usr/include/limits.h\n"
			"LLONG_MAX    9223372036854775807LL\n"
			"Les valeurs absolues du umérateur et du dénominateur ne\n"
			"devront pas dépasser cette valeur 9223372036854775807\n"
			);
	
		
		return 0;
	}
	

/*	utilise la fonction strtoll pour convertir les chaînes de 
 *	caractères en entier du type long long int
 *	#include <stdlib.h>
 *
 *	long int strtol (const char *nptr, char **endptr, int base);
 *	long long int
 *		strtoll(const char *nptr, char **endptr, int base);
 *	décommenter ci-dessous pour voir que 'long long int' est codé sur 8 octets
 *	soit 8*8 = 64 bits
 *	or 2^63 = 9223372036854775808 
 *	le 0 est compris dans les valeurs positives et donc 9223372036854775808-1 est 
 *	le plus grand entier positif et
 *	-9223372036854775808 est le négatif de plus grande valeur absolue
 *
 *	-9223372036854775808 <ou= x <ou= 9223372036854775807
 *	
 *	
 */
	
/* 
	printf("le type << long long int >> est codé sur %d octets\n",sizeof(long long int));
*/
	
	u = x = strtoll(argv[1], NULL, 10); 
	v = y = strtoll(argv[(argc==3)?2 : 3], NULL, 10);	
	if(u<0LL) {
			u = -u;
			signe = - signe;
	}
	if(v<0) {
			v = -v;
			signe = - signe;
	}
	a = u;
	b = v;
	while(v != 0LL) {
		w = u % v;
		u = v;
		v = w;
	}
	// printf("%lld\n",u); // le pgcd
	
	if(u == 1LL) {
		if(signe ==1) 
			printf("La fraction %lld / %lld est irréductible.\n",a, b);
		else
			printf("La fraction -%lld / %lld est irréductible.\n",a, b);
	} else {
		if(signe ==1) {
			printf( "La fraction %lld / %lld peut être simplifiée par %lld\n"
			"%lld / %lld est la fraction réduite.\n",
			a, b, u, a/u, b/u);
		} else {
			printf( "La fraction -%lld / %lld peut être simplifiée par %lld\n"
			"-%lld / %lld est la fraction réduite.\n",
			a, b, u, a/u, b/u);
		}
	}
	return 0;
}

				
	
