var premier=new Array(2,3);
for(var i=0;i<ndiff;i++) {
	premier[i+2] = premier[i+1]+difftable[i]*2;
}
var MAX_N = primemax;
// alert (MAX_N)

var rgpremier=[];
for(var i=0; i<premier.length;i++) {
	rgpremier[premier[i]]=i;
}

function gcd(a, b) {
  var u=a, v=b, w;
  while(v != 0) {
    w=u%v;
    u=v;
    v=w;
  }
  return u;
}

function ppcm(a, b) {
	var g=gcd(a,b);
	return a/g*b;
}

// Construction d'une table de nombres premiers
//var premier=new Array(2,3,5)
var MAX_MAX_N = 10000000;

var decperiode=new Array(0,1,
0,6,2,6,16,18,22,28,15,3,5,21,46,13,58,
60,33,35,8,13,41,44,96,4,34,53,108,112,42,130,
8,46,148,75,78,81,166,43,178,180,95,192,98,99,30,
222,113,228,232,7,30,50,256,262,268,5,69,28,141,146,
153,155,312,79,110,336,173,116,32,179,366,186,378,382,388,
99,200,204,418,140,215,432,219,221,32,152,460,154,233,239,
486,490,498,502,508,52,261,540,91,278,281,284,570,576,293,
592,299,300,202,51,88,618,315,32,107,646,326,658,220,224,
338,341,230,700,708,359,726,61,246,742,125,27,380,192,193,
393,199,202,810,820,822,413,276,419,213,856,26,862,438,440,
441,886,151,455,459,464,936,940,473,952,322,970,976,982,495,
166,252,253,1018,1020,103,1032,519,524,1050,212,1062,1068,1086,1090,
273,1096,1102,1108,558,561,564,575,1152,581,1170,1180,593,1192,200,
202,1216,1222,1228,41,206,208,1258,638,639,641,92,1290,1296,1300,
1302,653,659,55,1326,680,1366,686,1380,699,32,158,713,1428,1432,
719,1446,290,726,162,735,740,247,1486,248,373,214,755,761,1530,
1542,1548,1552,779,1566,1570,1578,1582,133,200,1606,201,403,1618,1620,
271,409,552,1662,833,556,423,1696,566,1708,430,287,866,1740,291,
584,879,1776,1782,893,1788,900,1810,1822,305,1846,1860,933,935,1872,
938,313,118,380,953,1912,386,21,1948,195,986,1978,331,664,998,
999,1001,670,2016,1013,2028,1019,342,2062,2068,1040,1041,298,1044,2098,
1055,2112,532,710,2136,2140,2142,2152,30,2178,1101,2206,553,2220,1118,
1119,1121,2250,1133,2268,2272,228,762,1146,2296,2308,231,583,2338,2340,
1173,1175,1178,2370,264,476,2382,2388,184,1199,2410,2416,2422,1218,305,
2446,2458,137,2472,619,278,630,46,2538,2542,2548,425,639,2578,259,
2592,1304,2616,2620,2632,882,2656,886,2662,1335,223,447,2686,42,1346,
2698,1353,1355,2712,1359,682,2730,2740,916,2752,2766,2776,2788,31,699,
1400,1401,2818,2832,709,1421,2850,408,2860,1439,2886,2896,2902,2908,1458,
2926,2938,984,1478,1481,371,2970,1499,1500,3010,3018,3022,253,380,508,
204,1533,1539,1541,1544,148,1559,156,3136,1581,3166,72,636,177,29,
1601,1604,1072,3220,1076,3250,542,3256,3258,1635,3298,3300,1653,3312,553,
1661,832,3330,3342,1673,1679,1680,3370,843,3388,1695,3406,1706,3432,431,
384,3460,3462,1733,3468,698,318,1755,879,3526,1764,1766,3538,20,1773,
254,1779,3570,3580,1194,3592,3606,602,3616,3622,1815,909,1821,3658,367,
3672,1838,1230,1232,3700,3708,1859,3726,933,1246,1880,3766,1884,3778,1264,
949,1901,3820,1274,3832,3846,770,963,3862,969,1940,1944,1953,1955,1958,
653,1961,491,1310,3942,1973,3966,3988,500,87,4006,34,4018,268,2013,
2024,4050,4056,4072,2039,4090,22,4098,2055,4126,2064,1033,4138,4152,2078,
693,4176,75,4210,4216,4218,4228,2115,1060,2121,1063,4258,4260,2135,1424,
2141,2144,1432,4326,4336,4338,4348,242,2181,1093,2195,314,551,4420,4422,
2220,4446,4450,4456,4462,2240,249,1123,751,1504,2258,753,2261,2273,1516,
2280,4566,4582,2295,2298,2301,924,61,2319,2321,7,4650,1552,222,4672,
2339,4690,4702,2360,2361,1182,1183,2375,2379,4782,2393,228,4792,2399,800,
802,4816,805,972,2435,1219,2444,1634,1636,2459,4930,2466,4936,4942,2475,
413,4966,828,226,2493,1664,357,2501,626,1670,5020,1674,2519,50,5058,
2538,1270,5086,5098,1700,2553,1704,853,2573,5152,5166,110,5178,5188,433,
372,2613,2615,5232,77,1052,5272,2639,2640,5296,5302,5308,2661,1333,2673,
2675,5380,2693,5392,2699,1802,2706,5416,5418,2715,1359,2720,907,2724,547,
1369,2739,2741,5500,5502,2753,2759,345,5526,5530,926,2781,1392,2786,5580,
2795,5622,2819,470,1882,5650,2826,5656,5658,5668,2841,316,1423,5700,571,
1429,5736,5740,5742,5748,5778,5782,965,1450,5806,2906,5820,2913,2919,2921,
1462,1950,5856,5860,2933,5868,2939,2940,5896,5902,2961,5926,5938,1984,5980,
2993,858,6010,6028,3018,3021,6046,3026,3033,6072,1013,761,2030,1220,6112,
3060,6130,1533,6142,1025,79,3086,3098,3099,443,6210,6216,6220,2076,6246,
6256,6262,6268,1045,1569,6286,94,6300,3155,3158,3161,3164,6336,6342,6352,
3179,1590,6366,1062,2126,6388,78,2140,1071,1612,2150,924,6472,270,1298,
815,1088,1091,3275,6552,3281,1642,6570,2192,1316,3299,2202,6618,474,3326,
6658,6660,6672,3339,1672,6690,6700,6702,6708,3359,3366,6736,1690,161,6778,
1356,679,6792,3401,6822,3413,6828,6832,855,6856,6862,6868,3435,3441,6898,
1151,3455,3458,3473,6948,3479,3480,6966,6970,6976,6982,3495,1749,1750,3506,
7018,1171,391,503,7056,7068,3539,7102,7108,3560,1018,594,275,3579,7176,
3593,7192,7206,1030,1803,7218,7228,402,3621,7246,74,3641,2432,3653,7308,
3660,1466,611,7348,1225,1842,7392,7410,2472,7432,7450,7456,7458,3738,748,
7486,1872,7498,3753,3758,3761,1882,2512,7540,3773,2516,3779,1890,631,7576,
7582,1084,3795,1267,7606,508,3819,3821,1912,284,7672,1920,7686,7690,7698,
7702,1929,1287,7726,860,7752,1939,3879,2596,7792,7816,7822,7828,56,3926,
3933,7872,3938,3939,3941,7900,3953,3959,7926,3966,7936,7948,3975,3981,2664,
2002,2670,8016,4019,4026,8058,8068,2020,8086,1348,4046,1620,811,2029,4061,
4073,1020,2722,8170,8178,1365,4104,8218,2740,4115,8232,4118,4121,8262,8268,
8272,8286,8290,2073,8296,4155,462,1041,8352,4181,4184,8376,599,8388,2806,
8422,8428,4215,4221,8446,2820,4233,8500,8512,710,2842,8536,2846,8542,4281,
4286,2860,2149,1433,1076,8622,4313,2876,4320,8646,8662,8668,723,868,2172,
4346,8698,4353,8712,4359,8730,2912,8740,4373,8752,876,22,8782,1467,8806,
8818,8820,4415,4418,4419,553,8860,8862,4433,8886,2223,1487,144,2233,2980,
4475,4481,4484,8970,4499,1125,3002,9010,2253,9028,1130,4521,4524,9058,4533,
10,9102,9108,3042,1522,9136,1525,4578,229,4586,3060,4593,4599,4601,2302,
9220,4613,4619,4620,9256,4638,928,1547,2323,4655,4659,4661,3112,9340,9342,
3116,9370,9376,4695,81,1567,4706,554,9420,4715,1048,4718,1573,9460,3154,
4733,9472,4739,9490,9496,1585,595,2383,9538,4773,955,4793,4800,267,3206,
9622,9628,4815,4821,603,1380,2419,1613,346,9696,4859,4860,2433,9738,9742,
9748,9766,4884,9780,4893,4895,4901,9810,9816,9828,9832,4919,9850,9856,3286,
4935,4941,9886,12,4953,4961,1241,9930,1988,9948,9966,554,10006,5004,386,
5019,10060,5033,10068,5039,10090,2523,3366,10102,5055,2533,10138,10140,5075,5079,
5081,5084,10176,10180,1456,10210,10222,569,10246,2563,10258,5133,79,10272,5144,
10300,3434,10312,2580,2066,5166,10336,10342,5178,2592,5195,1733,5213,948,10432,
5226,10456,10458,10462,1746,10486,10498,3500,10512,5264,10530,5279,10566,10588,5298,
1060,10606,758,5313,5315,5319,10650,10656,10662,5333,10686,10690,10708,595,5361,
596,2683,10738,512,2154,10780,10788,5399,5415,63,10846,5426,10858,10860,1811,
5441,2722,1210,10902,1212,10936,10938,10948,2739,2743,10978,5493,10992,5501,5513,
11046,11056,11058,11068,615,1847,482,2773,3704,2779,5559,11130,11148,5579,310,
11170,5586,11176,2799,2803,5619,5621,2250,11256,2252,11272,5639,11286,11298,377,
943,1132,1888,5675,11352,812,11382,11392,5699,2282,11422,2859,1907,11446,5733,
5735,5741,2872,766,11496,11502,5759,3842,11548,1925,11578,1931,11592,5798,11616,
11620,11632,11656,5838,5840,487,11698,11700,2929,5859,11730,11742,11776,3926,11782,
11788,2950,11806,5906,11820,5913,169,11832,5919,11862,5933,11886,11896,11902,11908,
5961,11926,5966,11938,11940,11952,5979,352,11970,11980,5993,4002,12010,3009,6020,
2007,6024,355,12072,4032,12100,6053,4036,12112,6059,12142,12148,2026,6080,6081,
3049,6101,4070,6113,6119,6120,12250,3063,12262,12268,3069,6140,384,2460,6161,
3082,4114,6173,6186,12376,12378,6195,1240,6204,6206,12420,4144,6218,12450,12456,
12472,6239,12486,12490,12496,12502,2085,149,12526,12538,4180,6273,12552,6284,12576,
12582,12588,6300,12610,6306,4206,3159,3160,12646,6326,12658,181,793,12696,4234,
12712,2120,4246,12742,2126,709,12780,6395,2133,6404,12820,12822,4276,6420,459,
3222,3223,12898,6453,6455,6458,2153,6461,12940,12952,6479,4322,2162,12978,12982,
1625,6501,13006,2168,4344,6518,6521,3262,13062,2182,13098,13102,13108,6560,13126,
939,1315,2193,6581,4390,13176,4394,6593,13216,4406,13228,1655,288,1894,737,
13290,13296,4436,13312,4442,13330,13336,13338,13366,13380,6698,957,13410,4472,13420,
6720,13450,13456,13462,13468,6738,13486,13498,4504,6761,13536,1936,4522,13576,1359,
3399,6806,1238,6813,4544,853,13668,6839,3420,4562,13690,326,13696,13708,6855,
6860,6861,3432,6875,362,6879,6881,13780,13788,6899,13806,13828,2305,6920,13858,
13872,3469,6939,6941,13900,13902,409,13912,696,13930,6966,6981,13966,6998,2333,
3502,14010,14028,14032,2810,14056,7035,1760,7041,14086,2351,14142,524,14152,7079,
3543,14176,91,14206,2844,7121,7124,14250,1190,1191,14302,3580,1023,14326,14340,
7173,449,7193,4796,3600,686,2882,4806,14422,555,7218,14446,3612,4820,7239,
7244,14502,7259,519,14536,14542,14548,485,2426,7280,809,7295,14592,14620,7313,
14628,14632,7319,3663,14656,14668,2447,14698,14712,7358,7361,14730,14736,14740,7373,
14752,7379,14766,2110,14778,14782,3699,7406,4940,2471,1483,7421,990,7433,4956,
7439,14886,14890,14896,7461,1866,14938,7473,1495,7478,7484,4994,3753,15016,7515,
3763,5020,15072,7538,7541,3018,604,7553,7560,3026,15136,15138,15148,3790,7586,
7593,15192,7599,15216,7613,15232,3810,15258,15262,1388,7635,3819,15286,1274,15298,
7653,5104,7659,7664,5110,15348,7679,256,1281,15376,15382,7695,275,7706,7713,
7719,7721,5150,15460,7733,15472,7746,1192,7755,15526,740,7775,2593,7784,15580,
15582,390,15606,15618,15628,391,7821,15646,489,5220,7833,1567,2613,7841,15726,
15730,2622,15736,15738,15748,394,15766,7886,7893,7895,3949,7901,3952,5272,15822,
15858,567,7940,15886,3972,15900,7953,15912,7959,7961,5312,7979,15970,121,7995,
2000,16006,16032,1784,3212,5354,8033,5356,16072,5362,16090,16096,16102,1611,16126,
16138,3228,16182,8093,852,16192,16216,16222,16228,8115,1354,8126,8133,16272,3260,
8159,4083,16338,16348,1636,8181,264,5460,16410,16416,16420,8213,16432,16446,16450,
2742,4119,2060,16486,4123,2753,8264,8273,16552,8280,16566,8286,8301,16606,16618,
8315,5544,8324,3330,16656,16660,16672,16690,2782,16698,16702,697,16740,8373,931,
29,8393,3362,16822,16828,8415,401,1205,2813,8441,8444,3380,5634,423,5642,
16930,16936,16942,8481,16978,16980,8493,16992,17010,3404,8513,17028,17032,2840,5682,
1421,2846,4273,17098,8553,4279,8561,5712,8579,17166,17182,17188,8595,2867,17206,
4302,8615,8619,17256,17290,1441,1922,1443,8660,17326,8666,5780,8675,2893,17376,
17382,8693,17388,17392,4350,17416);

declen=decperiode.length;

//alert(declen+" "+premier[declen-1])

var dectab = [];
var decper = function(x) {
	if(dectab[x]!=null) 
		return dectab[x];
	var u=rgpremier[x];
	if(x <= MAX_N && rgpremier[x] < declen) {
		return decperiode[rgpremier[x]]
	} else {
		var p=1;
		for(var i=1; i<x;i++) {
			p = (p*10)%x
			if(p==1) {
				dectab[x]=i;
				return i;
			}
		}
	}
}
//var terr1=rgpremier[6091], terr2=premier[terr1], terr3=decper(6091);
//alert(terr1+" "+terr2+" "+terr3)

// 3, 487, 56598313 
// A045616    Primes p such that decimal fraction 1/p has same period length as 1/p^2.
// The period length of the decimal expansion of a fraction by Helmut Richter
// http://www.lrz-muenchen.de/~hr/numb/period.html

var expfact = function(n) {
	return ((n==3 || n== 487)? 2 : 1);
}


//  multiplie avec k=1  et divise avec k=-1  (k exposant)
function decompose(ptab, etab,ftab, n, k) {
   var x=n, ep="",t="",j=0;
   for(var i=0; premier[i]<=Math.sqrt(x); i++) {
      var p=premier[i], e=0, f=1;
      while(x%p==0) {
        e += k;
	f *=p;
        x /=p;
      }
	if(e>0) {
		ep +=t+p+((e>1)?"^"+e:"")
		etab[j]=e;
		ptab[j]=p;
		ftab[j]=f;
		j++;
		t = " . "
	}
   }
	if(x>1) {
		if( x< MAX_N*MAX_N) {
			ep +=t+x
			etab[j]=1;
			ptab[j]=x;
			ftab[j]=x;
			j++;
			t = " . "
		} else { // dépassement des capacités
		return 0;
		}
	}
	return ep
}

function prod(tab, n0, n1, k) {
   for(var x=n0; u && x<=n1; x++) {
     	decompose(tab, x, k);
   }
}

var MAX_PREM;
var EcrPrim = new Array();
var NbDiv = new Array();
NbDiv[0]=1;
NbDiv[1]=1;

EcrPrim[0] = 1
EcrPrim[1] = 1
var nbChiff = new Array();
nbChiff[0]=1;
nbChiff[1]=1;
var EcrDec = new Array();
EcrDec[0] = 1;
EcrDec[1] = 1;


var itest=1, itest2=0;

function lecture() {
	var v = document.frm.t.value;
	v = v.replace(/\s+|[^0-9\/-]+/g,"")
	document.frm.t.value = v;
	if(v.search(/\//g)==-1) {
		return null;
	}
	var a = v.split(/\//);
	a[0]=parseInt(a[0]);
	a[1]=parseInt(a[1]);
	var signe=1
	if(a[0]<0) {a[0]=-a[0];signe=-signe;}
	if(a[1]<0) {a[1]=-a[1];signe=-signe;}
	var s=""
	s += ((signe==-1)?"-":"")
	s += a[0]+"/"+a[1];
	document.frm.t.value = s;

	return {"s":signe, "p":a[0], "q": a[1]}
}
function efface() {
	document.frm.t.value = "";
	document.getElementById("result").innerHTML="";
}

function cherche() {
	var uprem=[],unprem=0, ueprem=[], urgprem=[], periode=1;
	var testerreur=false
	var frac = lecture();
	var p, q, sig, ssig,q0;
	var st = "<pre>\n", interc;
	if(frac==null) {
		st += "L'écriture de la fraction semble incorrecte\n";
		testerreur=true
	} else {
		sig=frac.s; p=frac.p; q0=q=frac.q;
		ssig = ((frac.s<0)?"-":"")
		st += "La fraction proposée est r = "+ssig+frac.p+"/"+frac.q+"\n"
		//alert(frac.s+"\n"+frac.p+"\n"+frac.q)
		var g = gcd(p, q)
		if(g ==1) {
			st += "Cette fraction est irréductible\n"
			interc="proposée"
		} else {
			p /=g
			q /=g
			interc="réduite"
			st += "Cette fraction n'est pas irréductible, elle peut être simplifiée par\n" +
			      " le pgcd "+g+" de son numérateur et de son dénominateur.\n"
			
			if(q!=1) {
				st += "Après simplification par "+g+" la fraction devient r = "+ssig+p+"/"+q+"\n"
			} 
		}
		if(q==1) {
			if(g!=1) {
				st += "Après simplification par "+g+" on obtient l'entier r = "+ssig+p+"\n";
			} else {
				st += "le rationnel r est un entier : r = "+ssig+p+"\n";
			}
                                st +="</pre>";
				periode=1;
				document.getElementById("result").innerHTML=st;
                                return {periode: periode};
                        }

/*
                if(g!=1) {
                        p /=g
                        q /=g
                        st += "Cette fraction peut être simplifiée par "+g+"\n"
                        st += "Après simplification par "+g+" la fraction devient r = "+ssig+p+"/"+q+"\n"

                }
*/
		var numerateur=ssig+p, denominateur=q;
		st += "Le numérateur de la fraction est p = "+ssig+p+", le dénominateur est q = "+q+"\n"
		var ptab=[], etab=[], ftab=[], ktab=[];
		var epq=decompose(ptab, etab, ftab, q, 1)
		if(epq==0) {
			st += "L'application ne peut continuer la recherche :\n      la fraction proposée dépasse les capacités de calcul.\n"
			
			st +="</pre>"
                                document.getElementById("result").innerHTML=st
                                return {periode: -1};
		} else {
		st += "L'écriture primaire du dénominateur est q = "+denominateur+" = "+epq+"\n"
		var ent
		
		var obj = f2sum(ktab, ent, ftab, sig*p);
		var ent0 = obj.ent;
		
		st += "La fraction "+interc+" peut être décomposée en une somme \nr = "

		if(ent0 != 0) st += ent0;
		var n= ftab.length, dd=0, std="", stnd="", dtab=[];
                var fdecnum=new Array(0, 0);
                var fdecexp=new Array(0, 0);
		
		for(var i=0;i<n; i++) {
			var u=(ktab[i]<0)?" - ":" + ";
			var v=(ktab[i]<0)? -ktab[i]:ktab[i];
			if(i==0 && ent0==0 && u==" + ") u=""
			if(ptab[i]==2 || ptab[i]==5) {
				std += ((u==" + " && std=="")?" ": u) +v+"/"+ftab[i];
				if(etab[i]>dd) dd= etab[i];
				dtab[ptab[i]]=etab[i];
				var j=1;
				if(ptab[i]==2) j=0;
				fdecnum[j]=v
				fdecexp[j]=etab[i]
				//alert(ptab[i]+" "+v+" "+etab[i])
			} else {
				stnd += u+v+"/"+ftab[i];
			}
			st += u+v+"/"+ftab[i];
		  }
		}
		//alert(fdecnum[0]+" : "+fdecnum[1])
		for(var i=0; i<fdecexp[0]; i++) {
			fdecnum[0] /= 2
		}
		for(var i=0; i<fdecexp[1]; i++) {
                        fdecnum[1] /= 5
                }
		//alert(fdecnum[0]+" : "+fdecnum[1])
		var fnum = fdecnum[0]+fdecnum[1], fdecpart=fnum, fden=1;
		for(var i=0;i<fdecexp[0] || i<fdecexp[1]; i++, fnum *=10, fden*=10);
		fnum = Math.floor(fnum)


		if(ftab.length>1)
			st += "\n"+obj.bez;
		if(! testerreur) {
		st +="\n";
		st +="Cette somme r comprend le plus souvent trois parties :\n"+
		     "      a) un entier\n"+
		     "      b) une ou deux fractions dont le dénominateur est soit une puissance de 2,\n"+
		     "           soit une puissance de 5,(la somme de ces fractions est un nobre décimal)\n"+
		     "      c) des fractions dont les dénominateurs sont des puissances de nombres\n"+
		     "           premiers autres que 2 ou 5.\n\n"+
		     "Voyons ce que nous obtenons cette fois :\n\n"
		st += "a) Le terme entier est "+ ((ent0==0) ? "nul":ent0)+"\n\n"
		// if(testerreur==false) {
		
		if(dd>0) {
			
			st += "b) la partie fraction décimale non entière est égale à "+ std+"\n";
			st += "\telle peut se mettre sous la forme k/10^"+dd+" = "+fnum+"/"+fden+" = "+fdecpart+"\n"
			st += "\tla période débute donc au "+(dd+1)+"ème chiffre à droite de la virgule\n\n"
			//st += "c) la troisième partie de la somme, de période autre que 0 ou 9, s'obtient\n"+
		         //     "     en étudiant "+stnd+"\n\n";
		} else {
			st += "b) Le dénominateur de la fraction "+interc+" n'a aucun facteur 2 ou 5,\n"+
			      "     la période débute donc au premier chiffre à droite de la virgule\n\n"
			      
		}

		var nond=0;
		var lgperiodes=""
		
		for(var i=0;i<n; i++) {
			var u=(ktab[i]<0)?" - ":" + ";
                        var v=(ktab[i]<0)? -ktab[i]:ktab[i];
			var m= ptab[i];
			if(ptab[i]==2 || ptab[i]==5) continue;
			var mp=decper(m), pp=expfact(m);
			nond++;
			if(nond==1) st += "c) la troisième partie de la somme, de période autre que 0 ou 9, s'obtient\n"+
                              "     en étudiant "+stnd+"\n\n";

			if(pp!=null) {
			//  3^4   m= ptab[i]=3  etab[i]=4 l = decper(3)=1   pp=expfact(3)=2
			if (etab[i] <= pp) {
					var l = decper(m)
					lgperiodes += ((lgperiodes=="")?"":", ")+l
					st += u+v+"/"+ftab[i]+" a pour longueur de période "+l+"\n";
					if(l<=50) {
						st += "\tperiode : "+speriode(v,ftab[i],l)+"\n"
					}
					periode = ppcm(periode,l)
					
			} else {
			
		//		st += u+v+"/"+ftab[i]+" a pour longueur de période "+decperiode[rgpremier[m]]+"*"+m+"^"+(etab[i]-pp)+"\n"
				
				var r=decper(m);
				//alert(r)
				for(var ii=0;ii<(etab[i]-pp);ii++) {
					r *= m;
				}
				//alert(r)
				st += u+v+"/"+ftab[i]+" a pour longueur de période "+decperiode[rgpremier[m]]+"*"+m+"^"+(etab[i]-pp)+" = "+r+"\n"
				lgperiodes += ((lgperiodes=="")?"":", ")+r
				if(r<=100) {
                                                st += "\tperiode : "+speriode(v,ftab[i],r)+"\n"
                                        }

				periode = ppcm(periode,r)
			}
			}
		}
		var remarque="Remarque : le nombre r et la partie entière e sont négatifs, la mantisse m est positive,\n"+
                             "           Il faudra calculer r=(e+1)-(1-m) pour obtenir l'édriture décimale illimitée\n"
		if(nond==0) {
			st += "c) La troisième partie de la somme est vide (ou nulle).\n"
			st += "\nConclusion\n" + "Le rationnel proposé est un nombre décimal.\n"
			if(sig<0 && q!=1) {
				st +=remarque;
			}
		} else {
		st += "\nConclusion\n"
		//alert(nond)
		if(nond>1) {
			st += "La longueur de la période cherchée est le plus petit multiple commun des longueurs\n"+
			lgperiodes+"\ndes périodes des différents termes, elle est de "+periode+"\n";
		} else if(nond==1) {
			st += "La longueur de la période cherchée est "+periode+", c'est celle du seul terme non décimal\n";
		}
		if(sig<0 && nond>=1) {
                                st +=remarque;
                        }
		}
		}
	}
	//alert(p+" "+q)
	var quotient;
	if(periode<=3000) {
		var sstr=p+"/"+q+" = "+ssig;
		//alert(p+"/"+q+" "+dd+" "+periode)
		 quotient = division(p, q, dd, periode, 73, sstr)
		st += quotient+"\n"
	}
	if(arguments.length==0 && periode<=11 && periode+dd<=12) {
		var qt = division(p, q, dd, periode, 100, "")
		document.ecrit.decim.value=qt
		calcule(false)
	}

	st +="\n</pre>"
	document.getElementById("result").innerHTML=st
	return {periode: periode}
}

function speriode(n, d, l) {
	var s=" ";
	var u= parseInt(n), q=parseInt(d), len=parseInt(l);
	u = u%q;
	for(var i=0; i<len; i++) {
		u *=10;
		s += Math.floor(u/q)
		u = u%q;
	}
	return s
}

function signe(x) {	return ((x<0)?-1:1);}

function fraction(num, den) {
	this.sg = signe(num)*signe(den);
	this.num=num;
	this.den=den;
	this.p=Math.abs(num);
	this.den=den;
	this.q=Math.abs(den);
	this.g=gcd(this.p, this.q);
	if(this.g>1) {
		this.p /= this.g
		this.q /= this.g
	}
	this.pprem=[];  // premier
	this.fprem=[]; // primaire
	this.eprem=[];  // exposants
	this.ecrprim = decompose(this.pprem, this.eprem, this.fprem, this.q, 1);
	this.num=[]
	this.kprem=[]
	f2sum(this.kprem, this.ent, this.fprem,this.num);
}

function gcdext(a, b) {
	var u=a, v=b, w, t, x=new Array(0, 1), y=new Array(1,0), k=0;
	/*
		x = 0 1		x[k+2] = x[k]+ q * x[k+1]
		y = 1 0 	y[k+2] = y[k]+ q * y[k+1]
	
	*/
	
	while(v!=0) {
		w = u%v;
		q = Math.floor(u/v);
		u=v; 
		v=w;
		x[k+2] = x[k]+ q * x[k+1]
		y[k+2] = y[k]+ q * y[k+1]
		k++;
	}
	var r=y[k]*a-x[k]*b, sg=(r<0)?-1:1
	var alpha=(sg*y[k])
	var beta=(-sg*x[k])
	var z={"gcd": u, "beta": (-sg*x[k]), "alpha": (sg*y[k]), "calc": (alpha*a+beta*b)}
	
	//alert("a= "+a+", b= "+b+", u= "+u+", v= "+v+",        y= "+(sg*y[k])+", x= "+(-sg*x[k])+",        r= "+(sg*r))
	return z
}
	
//gcdext(25, 13)	
//gcdext(13, 29)
//gcdext(26, 58)

function f2sum(ktab, ent, ftab, numer) {
	var prod = 1, n=ftab.length, alpha, beta, u, v, s=0, num=numer;
	var st = ""
	//alert(n)
	//alert("ftab = "+ftab)
	for(var i=0;i<n; i++)
		prod *= ftab[i];
	s = Math.floor(num/prod);
	num -= prod*s;
	beta=num
	// alert(s+" "+num)
	//alert(numer+" "+prod+" "+num+" "+s)
	//st += "Le dénominateur est "+prod+"\n"
	if(n==2)
	st += "L'égalité de Bézout utilisée pour construire la somme des deux fractions est\n"
	else
	st += "Les "+(n-1)+" égalités de Bézout utilisées pour construire progressivement cette\n"+
	      "  somme de "+ n +" fractions sont\n"
	for(var i=0;i<n-1;i++) {
		st +=(i+1)+") "+prod+" = "+ftab[i]+"*"
		prod /= ftab[i];
		st +=prod+"  :  "
		var z = gcdext(ftab[i], prod);
		st +="("+z.alpha+")*"+ftab[i]+" + ("+z.beta+")*"+prod+" = 1\n"
		//alert(beta+" "+ftab[i]+" "+prod+" "+z.alpha+" "+z.beta)
		alpha = z.beta*beta;    //
		beta = z.alpha*beta;      // conserver l'ordre des 2 lignes
		u = Math.floor(alpha/ftab[i]);
		v=Math.floor(beta/prod);
		s += u+v;
		alpha -= u*ftab[i];
		beta -= v*prod;
		ktab[i]=alpha;
		//st +="\n";
	//	alert(ftab[i]+" "+prod+" "+z.alpha+" "+z.beta+"\n"+u+" "+v+" "+s+" "+alpha+" "+beta+" ")
	}
	//alert(st)
	ktab[n-1]=beta;
	ent=s;
	//return s;
	return {ent:s, bez: st}
}

/*
bugs vus :

898456201/344693212026
*/
function hasard() {
	var a=Math.floor(1000000*Math.random()), b=Math.floor(MAX_N*Math.random());
	// if(Math.random()<0.5) 		b *=Math.floor(MAX_N*Math.random());
	
	a=a%b
	document.frm.t.value = a+"/"+b
}	
	
var exo = function(a, b) {
	document.frm.t.value=a+"/"+b
	cherche();
}

var invdencurrent=27;

function invdennext(k) {
	invdencurrent +=k;
	if(invdencurrent<2)
		invdencurrent=2
	document.frm.t.value = "1 / "+invdencurrent
	cherche();
}


var periodetab=[]

function intervalle(a, b) {
	var u, 
	s="Longueur de la période de 1/n, de n="+a+" à n="+b+" : ", s0="", 
	s2="Valeurs des n pour lesquelles la longueur de la période de 1/n est n-1 : ", s1="",
	s4="Valeurs des n pour lesquelles la longueur de la période de 1/n est (n-1)/2 : ", s3="";
	s6="Valeurs des n pour lesquelles la longueur de la période de 1/n est (n-1)/3 : ", s5="";
        s8="Valeurs des n pour lesquelles la longueur de la période de 1/n est (n-1)/4 : ", s7="";
        s10="Valeurs des n pour lesquelles la longueur de la période de 1/n est (n-1)/5 : ", s9="";
	s12="Valeurs des n pour lesquelles la longueur de la période de 1/n est (n-1)/6 : ", s11="";
	s14="Valeurs des n pour lesquelles la longueur de la période de 1/n est (n-1)/7 : ", s13="";
	for(var x=a; x<=b; x++) {
		document.frm.t.value = "1 / "+x
		u = cherche()
		//periodetab[x]=u.periode
		s+=u.periode+","
		if(s.length>73) {
			s0 +=s+"\n";
			s="";
		}
		if(u.periode==x-1) {
			s2+=x+",";
			if(s2.length>73) { s1 +=s2+"\n"; s2=""; }
		}
		if(2*u.periode==x-1) {
                        s4+=x+",";
                        if(s4.length>73) { s3 +=s4+"\n"; s4=""; }
                }
                if(3*u.periode==x-1) {
                        s6+=x+",";
                        if(s6.length>73) { s5 +=s6+"\n"; s6=""; }
                }
                if(4*u.periode==x-1) {
                        s8+=x+",";
                        if(s8.length>73) { s7 +=s8+"\n"; s8=""; }
                }

                if(5*u.periode==x-1) {
                        s10+=x+",";
                        if(s10.length>73) { s9 +=s10+"\n"; s10=""; }
                }
                if(6*u.periode==x-1) {
                        s12+=x+",";
                        if(s12.length>73) { s11 +=s12+"\n"; s12=""; }
                }

                if(7*u.periode==x-1) {
                        s14+=x+",";
                        if(s14.length>73) { s13 +=s14+"\n"; s14=""; }
                }


	}
	if(s!="") { s0 += s; s=""; }
        if(s2!="") { s1 += s2; s2=""; }
	if(s4!="") { s3 += s4; s4=""; }
        if(s6!="") { s5 += s6; s6=""; }
        if(s8!="") { s7 += s8; s8="" }
        if(s10!="") { s9 += s10; s10=""; }
        if(s12!="") { s11 += s12; s12=""; }
        if(s14!="") { s13 += s14; s14=""; }

	s0=s0.replace(/\,+\n*$/,"")+"\n-------------\n"
	s1=s1.replace(/\,+\n*$/,"")+"\n-------------\n"
	s3=s3.replace(/\,+\n*$/,"")+"\n"
        s5=s5.replace(/\,+\n*$/,"")+"\n"
        s7=s7.replace(/\,+\n*$/,"")+"\n"
        s9=s9.replace(/\,+\n*$/,"")+"\n"
        s11=s11.replace(/\,+\n*$/,"")+"\n"
        s13=s13.replace(/\,+\n*$/,"")+"\n"

	document.getElementById("result").innerHTML="<pre>"+
	"Représentation décimale de 1/n\n"+
	"==============================\n"+
	s0+s1+s3+s5+s7+s9+s11+s13+"</pre>"
}

function seq(){
	var s=document.ecrit.t.value, u;
	do {
		u=s
		s=s.replace(/^\s+/,"")
		s=s.replace(/\s+$/,"")
		s=s.replace(/\s+/g," ")
	}while(u!=s);
	var v=s.split(/\s+/g)
	var a=parseInt(v[0]), b=parseInt(v[1])
	if(a<1) a=1
	if(b<1) b=a+1
	if(b-a>999) b=a+999;
	document.ecrit.t.value=a+" "+b
	intervalle(a, b)
	a=b+1; b=a+99;
	document.ecrit.t.value=a+" "+b
}



function lperiod10(a, b, sexpr) {
	var expr = sexpr, uexp;
/*
	do {
		uexp = expr;
		expr = expr.replace(/for/gi," ")
		expr = expr.replace(/while/gi," ")
		expr = expr.replace(/if/gi," ")
		expr = expr.replace(/else/gi," ")
                expr = expr.replace(/break;/gi," ")
                expr = expr.replace(/do/gi," ")
                expr = expr.replace(/write/gi," ")
                expr = expr.replace(/document/gi," ")
                expr = expr.replace(/Element/gi," ")
                expr = expr.replace(/image/gi," ")
                expr = expr.replace(/parent/gi," ")
		expr = expr.replace(/alert/gi," ")
		expr = expr.replace(/back/gi," ")
		expr = expr.replace(/history/gi," ")
	} while(uexp != expr);
*/
	var s1="S(relation "+expr+") : ", s0="",n,h, Lp;
	with(Math) {
	for(n=a; n<=b; n++) {
		var u=1;
		for(Lp=1; Lp < n; Lp++) {
			u = (u*10)%n;
			if(u==1) 
				break;
		}
		if(u==1 && (eval(expr)==true)) {
			s1 += n+","
			if(s1.length>73) {
				s0 += s1+"\n"
				s1=""
			}
		}
	}
	}
	if(s1!="") {
		s0 +=s1+"\n"
	}

	return s0;
}

function seqcritere() {
	var s=document.ecrit.crit.value,u, st;
	do {
		u=s
		s = s.replace(/^[\;\s]+/,"")
	} while(u!=s);
	var t = s.split(/\;/)
	if(t.length<3) return;
	for(var i=0; i<3; i++) {
		do {
			u=t[i]
			t[i] = t[i].replace(/^\s+/,"");
			t[i] = t[i].replace(/\s+$/,"");
		} while(u!=t[i]);
	}
	st = lperiod10(parseInt(t[0]), parseInt(t[1]), t[2])

	document.getElementById("suite").innerHTML="<pre>"+st+"</pre>"
}

function relex(a, b, s) {
	document.ecrit.crit.value=a+" ; "+b+"; "+s
	seqcritere();
}


