A version which uses a fixed base^dynamic power series
//====Headers
#define VERSION "Infinity Compressor 1.05 fixedbase chain\n"
//..\gcc -O2 main.c -lmpfr -lgmp -o a.exe
//the code is of bit of mess, this is unchunked, single file at onc eversion which takes alot of time to search
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include <time.h>
#include <gmp.h> //using libgmp.a
#include <mpfr.h>
//======Types
#define u1 unsigned char
#define u2 unsigned short
#define u4 unsigned int
#define u8 unsigned long long
#define s1 signed char
#define s2 signed short
#define s4 signed int
#define s8 signed long long
#define f2 short float
#define f4 float
#define f8 double
#define f10 long double
//====Bithacks
#define setb(o,p) (o|=(1<<p)) //byte| 1<< pos
#define clrb(o,p) (o&=(~(1<<p))) // byte | 11101111
#define togb(o,p) (o^=(1<<p))
#define chkb(o,p) ((o>>p)&1)
#define bitchar(bitchar_bit) (48|bitchar_bit) // 48|0 or 1
//====Func GCC
static __inline__ u8 rdtsc(void){u8 x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x;}
u8 fsize(u1* filename){
FILE* tfile=fopen(filename,"rb");
if(!tfile){perror(filename);return 0;}
fseek(tfile,0,SEEK_END);
u8 sz=(u8)(ftell(tfile));fclose(tfile);return sz;}
u1* getcontent(u1*filename){//file to buffer
u8 size=fsize(filename);//
if(!size){perror("Zero length content"); return NULL;}
u1* res=malloc(size);
if(!res){perror("Malloc failure");return NULL;}
FILE* inpfile=fopen(filename,"rb");
if(!inpfile){perror("File cannot be read");return NULL;}
u8 findex=(u8)fread(res,1,size,inpfile);fclose(inpfile);
if(findex!=size){perror("size mismatch");return NULL;}
return res;}
void readcontent(u1* filename,u1* storage){
if(!filename){perror("Invalid filename"); return;}
u8 inpsize=fsize(filename);
if(!inpsize){perror("File empty");return;}
FILE* in=fopen(filename,"rb");
if(!in){perror(filename);return;}
storage=realloc(storage,inpsize);
if(!storage){perror("Malloc failure");return;}
u8 findex=(u8)fread(storage,1,inpsize,in);
fclose(in);
if(findex!=inpsize){perror("Read size mismatch");return;}}
void writecontent(u1* filename,u1* content,u8 size){
FILE* out=fopen(filename,"wb");
if(!out){perror(filename);return;}
u8 findex=(u8)fwrite(content,1,size,out);fclose(out);
if(findex!=size) perror("Write size mismatch");}
void buf2mpz(u1* string,mpz_t num,u8 size){
if(!string){perror("NULL string");return;}
if(!num){perror("Invalid mpz_t");return;}
if(!size){perror("Zero-length string");return;}
mpz_import(num,size, 1,1, -1, 0,string);
}
u1* mpz2buf(mpz_t num){
u1* res=malloc( (mpz_sizeinbase(num,16)/2)+2);
mpz_export(res,NULL,1,1,-1,0,num);return res;}
#define loop(loopx,loopy) for(loopx=0;loopx<loopy;loopx++)
#define fextension(string) strrchr(string,'.')?:".???"
#define isbit(xint,ypos) ((xint)&(1<<ypos))
#define frop(x,filename) FILE* x=fopen(filename,"rb")
#define fwop(x,filename) FILE* x=fopen(filename,"wb")
#define outx(x,fil) fwrite(&x,1,sizeof(x),fil);
#define mpz(x) mpz_t x;mpz_init(x);
#define mpf(x) mpfr_t x;mpfr_init(x);
//static array
#define mpfr(x) MPFR_DECL_INIT(x, 53) //returns float
#define DEBUG 1 //debug
#define DEBUG2 1 //symbolics
#define DEBUG3 1 //verbose
#define POWERPREC 1024 ///200 //more=slower, more precise
#define fdisp(x) puts("");mpf_out_str(stdout,10, 0,x);
//===========MAIN======================
#define setch(o,ch,pos) (o|=ch<<(pos<<1)) // pos 0-3,ch=0-3
#define getbb(o,pos) ((o>>(pos<<1))&3) //get 001100
>>2 &3
#define getb0(b) (b&3)
#define getb1(b) ((b
>>2)&3)
#define getb2(b) ((b
>>4)&3)
#define getb3(b) ((b
>>6)&3)
#define PR0 MPFR_RNDN
#define MAXPOW "10e1000"
#define MINPOW "0"
//power^(power^power) from 10^(10^10) to 0
//(1<<(pos<<1))
//========MAIN===
//code is from another compressor i wrote
void main(int argc,char**argv){
if(!argv[1]){printf("Syntax:cmp inputfile [-d=decode]");exit(1);}
//-----DECODE--TODO-----
if(argv[2] && !strcmp(argv[2],"-d")){//decode Data
FILE* inp=fopen(argv[1],"rb");
if(!inp){perror("No file");exit(2);}
u8 outsize;fread(&outsize,8,1,inp);
if(DEBUG)printf("\nFilesize:%llu",outsize);
u8 bitlen=outsize*8;mpfr_set_default_prec( bitlen);
mpf(Power);//read powers and signs.
//todo
mpz(Z);
//mpfr_get_z(Z,Result,PR0);
FILE* output=fopen("Decode.dat","wb");
mpz_out_raw(output, Z);//slightly larger
//fwrite(&out,1,outsize,output);//end: does not work
exit(10);
}
//------INPUT--------
if(DEBUG3)printf(VERSION);
/*
>> MPFR_RNDN: round to nearest (roundTiesToEven in IEEE 754-2008),
MPFR_RNDZ: round toward zero (roundTowardZero in IEEE 754-2008),
MPFR_RNDU: round toward plus infinity (roundTowardPositive in IEEE 754-2008),
MPFR_RNDD: round toward minus infinity (roundTowardNegative in IEEE 754-2008),
MPFR_RNDA: round away from zero.
*/
FILE* output=fopen("Result.cmp","wb");
u8 inpsize=fsize(argv[1]);
fwrite(&inpsize,8,1,output);//write inpsize to avoid misdecoding;
u8 bitlen=inpsize*8;
s4 check,checklow,checkhi,checkold;
if(!inpsize){perror("input size invalid");return;};
u1* input=getcontent(argv[1]);
//convert to mpz
mpfr_set_default_prec( bitlen);
mpz(Z);buf2mpz(input,Z,inpsize);
mpf(median);mpf(logs);//Z->median
mpfr_set_z(median,Z,PR0);
mpf(Result);//Power is 512 bits;result stores Base^Power
mpf(Resbase);//p^p=resbase
mpfr_t fixedbase;mpfr_init2(fixedbase,POWERPREC);
mpfr_set_str(fixedbase,"1e-100",10,PR0);
mpfr_add_ui(fixedbase,fixedbase,1,PR0);
if(mpfr_cmp_ui(fixedbase,1)==0){puts("PowerPrec too low");exit(11);}
mpfr_t Power;mpfr_init2(Power,POWERPREC);
mpfr_t Powermin;mpfr_init2(Powermin,POWERPREC);
mpfr_t Powermax;mpfr_init2(Powermax,POWERPREC);
mpfr_t Powerold;mpfr_init2(Powerold,POWERPREC);
mpfr_set_str(Powermin,MINPOW,10,PR0);
mpfr_set_str(Powermax,MAXPOW,10,PR0);
mpfr_set_str(Powerold,"-1",10,PR0);
mainloop:;//search for closest match
//power=avg(Powermax,Powermin)
//code is just a simple power series(it does not have any compression advantage without window modifiers)
mpfr_add(Power,Powermax,Powermin,PR0);
mpfr_div_2ui(Power,Power,1,PR0);
checkold=mpfr_cmp(Power,Powerold);
mpfr_pow(Result,fixedbase,Power,PR0);
//mpfr_pow(Result,Power,Resbase,PR0);
check=mpfr_cmp(Result,median);
if(checkold==0){if(DEBUG2)printf("#\n");
//Write power to output, ssubstract Median-Result
//if neg, fprintf "-" to o
mpfr_sub(median,median,Result,PR0);
fprintf(output,"\n");
if(mpfr_cmp_si(median,0)<0){
fprintf(output,"-");mpfr_abs(median,median,PR0);}
mpfr_out_str(output,16,0,Power,PR0);
mpfr_log2(logs,median,PR0);
if(DEBUG3)printf("Distance=%d",mpfr_get_ui(logs,PR0));
mpfr_set_str(Powermin,MINPOW,10,PR0);
mpfr_set_str(Powermax,MAXPOW,10,PR0);
mpfr_set_str(Powerold,"-1",10,PR0);
if(mpfr_cmp_si(logs,1)<0){puts("::Final result reached");exit(2);}; goto mainloop;}
if(check>0){if(DEBUG2)printf("+");
mpfr_set(Powerold,Power,PR0);
mpfr_swap(Powermax,Power);
goto mainloop;}
if(check<0){if(DEBUG2)printf("-");
mpfr_set(Powerold,Power,PR0);
mpfr_swap(Powermin,Power);
goto mainloop;}
fprintf(output,"\n");
mpfr_out_str(output,16,0,Power,PR0);//write final power(hex)
;}