MacroCell resultat(int s,int[][] rule){//calcul du rsultat au laps de temps 2^s, avec s<=(n-2)
		if(this.results.containsKey(s)) return this.results.get(s);//le resultat voulu tait dj calcul
		
		//le cas de base est n=3, car le resultat doit etre une MacroCell
		//si s=0 le traitement est diffrent (rsulat dans un pas de temps!)
		if(s==0){
			if(this.n==3){
				boolean[][] actuel = new boolean[6][6];
				for(int i=1;i<7;i++){
					for(int j=1;j<7;j++){
						if(i<4&&j<4) actuel[i-1][j-1]=this.hautGauche.valeurs[i][j];
						if(i<4&&j>=4) actuel[i-1][j-1]=this.hautDroit.valeurs[i][j-4];
						if(i>=4&&j<4) actuel[i-1][j-1]=this.basGauche.valeurs[i-4][j];
						if(i>=4&&j>=4) actuel[i-1][j-1]=this.basDroit.valeurs[i-4][j-4];
					}
				}
				boolean[][] suivant = NaiveLife.etatSuivant(actuel, rule);
				boolean[][] res = new boolean[4][4];
				for(int i=0;i<4;i++){for(int j=0;j<4;j++){res[i][j]=suivant[i+2][j+2];}}
				MacroCell resultat =construct(res);
				this.results.put(0, resultat);//on memorise le resultat pour ne pas le recalculer
				return resultat;
			}			
			else{
				MacroCell rhg = hautGauche.resultat(0, rule);
				MacroCell rhd = hautDroit.resultat(0, rule);
				MacroCell rbg = basGauche.resultat(0, rule);
				MacroCell rbd = basDroit.resultat(0, rule);
				MacroCell hCross = construct(hautGauche.hautDroit,hautDroit.hautGauche,hautGauche.basDroit,hautDroit.basGauche).resultat(0, rule);
				MacroCell gCross = construct(hautGauche.basGauche,hautGauche.basDroit,basGauche.hautGauche,basGauche.hautDroit).resultat(0, rule);
				MacroCell dCross = construct(hautDroit.basGauche,hautDroit.basDroit,basDroit.hautGauche,basDroit.hautDroit).resultat(0, rule);
				MacroCell bCross = construct(basGauche.hautDroit,basDroit.hautGauche,basGauche.basDroit,basDroit.basGauche).resultat(0, rule);
				MacroCell mCross = construct(hautGauche.basDroit,hautDroit.basGauche,basGauche.hautDroit,basDroit.hautGauche).resultat(0, rule);
				MacroCell resultat = construct(construct(rhg,hCross,gCross,mCross).centre(),construct(hCross,rhd,mCross,dCross).centre(),
						construct(gCross,mCross,rbg,bCross).centre(),construct(mCross,dCross,bCross,rbd).centre()
						);
				this.results.put(0, resultat);
				return resultat;
			}
		}
		else{//tjs cas de base n==3
			if(n==3){//forcment s=1 car s>0 et s<=n-2==1
				boolean[][] actuel = new boolean[8][8];
				for(int i=0;i<8;i++){
					for(int j=0;j<8;j++){
						if(i<4&&j<4) actuel[i][j]=this.hautGauche.valeurs[i][j];
						if(i<4&&j>=4) actuel[i][j]=this.hautDroit.valeurs[i][j-4];
						if(i>=4&&j<4) actuel[i][j]=this.basGauche.valeurs[i-4][j];
						if(i>=4&&j>=4) actuel[i][j]=this.basDroit.valeurs[i-4][j-4];
					}
				}
				boolean[][] suivant = NaiveLife.etatSuivant(NaiveLife.etatSuivant(actuel, rule),rule);
				boolean[][] res = new boolean[4][4];
				for(int i=0;i<4;i++){for(int j=0;j<4;j++){res[i][j]=suivant[i+4][j+4];}}
				MacroCell resultat =construct(res);
				this.results.put(1, resultat);
				return resultat;
			}
			else{
				MacroCell rhg = hautGauche.resultat(s-1, rule);
				MacroCell rhd = hautDroit.resultat(s-1, rule);
				MacroCell rbg = basGauche.resultat(s-1, rule);
				MacroCell rbd = basDroit.resultat(s-1, rule);
				MacroCell hCross = construct(hautGauche.hautDroit,hautDroit.hautGauche,hautGauche.basDroit,hautDroit.basGauche).resultat(s-1, rule);
				MacroCell gCross = construct(hautGauche.basGauche,hautGauche.basDroit,basGauche.hautGauche,basGauche.hautDroit).resultat(s-1, rule);
				MacroCell dCross = construct(hautDroit.basGauche,hautDroit.basDroit,basDroit.hautGauche,basDroit.hautDroit).resultat(s-1, rule);
				MacroCell bCross = construct(basGauche.hautDroit,basDroit.hautGauche,basGauche.basDroit,basDroit.basGauche).resultat(s-1, rule);
				MacroCell mCross = construct(hautGauche.basDroit,hautDroit.basGauche,basGauche.hautDroit,basDroit.hautGauche).resultat(s-1, rule);
				//on a saut de 2^(s-1)
				MacroCell resultat = construct(construct(rhg,hCross,gCross,mCross).resultat(s-1,rule),construct(hCross,rhd,mCross,dCross).resultat(s-1,rule),
						construct(gCross,mCross,rbg,bCross).resultat(s-1,rule),construct(mCross,dCross,bCross,rbd).resultat(s-1,rule)
						);
				//et encore de 2^(s-1), donc de 2^s
				this.results.put(s, resultat);
				return resultat;
			}						
		}
	}