/*******************************************************************/
/*                                                                 */
/* Ez a program az f(x)=3x (mod 1) dinamikai rendszerben szamolja  */
/* az x es az f^n(x) korrelaciojat n=1,2,...,nmax-ra, egy 2^m elemu*/
/* diszkret racson, ahol 'm' az 'int' tipus abrazolasahoz hasznalt */
/* bitek szama. A szamolas (ezen a racson) egzakt.                 */
/*                                                                 */
/* A program kifejezetten CSAK olyan gepen fut helyesen, ahol      */
/* a 'long int' tipus merete ketszerese az 'int'-enek.             */
/* Ez a legtobb 32 bites gepen a legtobb c-forditoval NEM igy van. */
/* A circle.renyi.hu-n  'cc -fast' opcioval erdemes forditani.     */
/* A futasahoz (a circle-en) kb. 7 ora TISZTA processzorido kell   */
/* nmax=100 eseten.                                                */
/* (Ezen a gepen m=32.)                                            */
/*                                                                 */
/* A program kimenete a lepesszam (n) fuggvenyeben a szorzat       */
/* varhato ertekenek 2^{3m} -szerese ket longint-en abrazolva.     */
/* A program kulon oszlopban irja ki a magas es az alacsony szot.  */
/* Igy a tenyleges korrelacio                                      */
/*                                                                 */
/* corr=12*( (2^{2m} * felso + also) /2^{3m} - 1/4)                */
/*                                                                 */
/* ami igen jo kozlitessel 12* ( felso/2^m - 1/4 )                 */
/*                                                                 */
/*******************************************************************/

#include<stdio.h>

int nmax=100;

unsigned long int SNalso[200],SNfelso[200],xlong,szorzat;
unsigned int n,x,y;
unsigned long* also;
unsigned long* felso;

FILE *output;

main(){

also=SNalso;felso=SNfelso;
for(n=0;n<nmax;n++) {*also=0;*felso=0;also++;felso++;}

for(x=1;x;x++) {
  xlong=x;y=x;
  also=SNalso;felso=SNfelso;
  for(n=0;n<nmax;n++) {
    y*=3;
    szorzat=xlong*y;
    *also+=szorzat; if(*also<szorzat) (*felso)++;
    also++;felso++;
    }
  }

output=fopen("triple.txt","w");

fprintf(output,"n\t felso\t also\n");
also=SNalso;
felso=SNfelso;
for(n=0;n<nmax;n++) {
  fprintf(output,"%d\t %lu\t %lu\n",n+1,*felso,*also);
  also++;felso++;
  }
fflush(output);
fclose(output);
}
