summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Weigt <juw@posteo.de>2026-01-18 11:10:15 +0100
committerJulian Weigt <juw@posteo.de>2026-02-04 15:56:45 +0100
commit6ceb2c20056d6cece59791686deeeac312fa6009 (patch)
treefe27df646842043eda64c5db5c5df15ff28f59d7
parent0cdd21e9cd45c0957e3e7ba3515ac5d1eb79d337 (diff)
Use array for p independent of k and accordingly print grouped according to p.
-rw-r--r--charf.c117
1 files changed, 71 insertions, 46 deletions
diff --git a/charf.c b/charf.c
index 88a5d96..c33a88d 100644
--- a/charf.c
+++ b/charf.c
@@ -41,7 +41,7 @@
#define K 24
/*maximal number of exponents*/
-#define P 1
+#define P 2
/*given function df[0] on domain [0,M-1], compute derivatives f' until f^{(K)} and store f^{(K)} in df*/
void differentiate(VALUETYPE* f, VALUETYPE* df, int D, int k){
@@ -182,7 +182,7 @@ void format_result(char* s, int index, int k, EXPTYPE p, VALUETYPE r, int format
int l = 0;
char v[128];
root_to_latex(v,r,p);
- l += sprintf(s+l,"$%d$ & $\\frac1{%1.0f}$ & %s",k,exptype_to_double(p),v);
+ l += sprintf(s+l,"$%d$ & %s",k,v);
for(int i=0; i<d; i++){
valuetype_to_latex(v,f[i]);
l += sprintf(s+l,"& %s ",v);
@@ -195,7 +195,7 @@ bool over_threshold_charf(double t, int k){
return (k==1 && t>=1) || (k==2 && t>=.5) || (k==3 && t>.53) || (k==4 && t>=.5) || (k==5 && t>=.58) || (k==6 && t>=.58) || (k==7 && t>=.69) || (k==8 && t>=.83) || (k==9 && t>=.8699) || (k==10 && t>=.919) || (k==11 && t>=.97) || (k==12 && t>=.97) || (k==13 && t>=.98) || (k==14 && t>=.98) || (k==15 && t>=.9817) || (k==16 && t>=.9817) || (k==17 && t>=.987) || (k==18 && t>=.991) || (k==19 && t>=.994) || (k==20 && t>=1.001) || (k==21 && t>=1.009) || (k==22 && t>=1.009) || (k==23 && t>=1.003) || (k==24 && t>=1.174) ;
}
-int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE (*records_ratio)[K+1][P], int (*records_index)[K+1][P]){
+int compute(int index, EXPTYPE exponents[P], VALUETYPE (*records_ratio)[K+1][P], int (*records_index)[K+1][P]){
VALUETYPE f[N];
int D = generate_function(f,index);
/*Immediately abort if index is out of bounds.*/
@@ -224,7 +224,7 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET
differentiate(dMf[(k+1)%2],dMf[k%2],D,1);
}
- for(int p=0; p<num_exponents[k]; p++){
+ for(int p=0; p<P; p++){
/*Print derivatives*/
/*
for(int k=0; k<=K; k++){
@@ -238,8 +238,8 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET
*/
/*Compute L^p norm of derivatives*/
- VALUETYPE intdfp = integratep(df[k%2],exponents[k][p],D);
- VALUETYPE intdMfp = integratep(dMf[k%2],exponents[k][p],D);
+ VALUETYPE intdfp = integratep(df[k%2],exponents[p],D);
+ VALUETYPE intdMfp = integratep(dMf[k%2],exponents[p],D);
//printf("%d: %f / %f = %f\n",k,intdMfp[k],intdfp[k],intdMfp[k]/intdfp[k]);
@@ -254,7 +254,7 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET
if(is_greater_certainly(r,(*records_ratio)[k][p])){
(*records_index)[k][p] = index;
char s[1024];
- format_result(s, index, k, exponents[k][p], r, FORMAT_TEXT);
+ format_result(s, index, k, exponents[p], r, FORMAT_TEXT);
printf("%s\n",s);
}
(*records_ratio)[k][p] = maximum((*records_ratio)[k][p],r);
@@ -264,49 +264,78 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET
return D;
}
-void format_results(char* text, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], int format){
+void format_results(char* text, EXPTYPE exponents[P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], int format){
+ char beginning[1024];
+ char end[1024];
+ char beginningp[P][1024];
+ char endp[P][1024];
char newline[4];
- if(format == FORMAT_TEXT) strcpy(newline,"");
- else if(format == FORMAT_LATEX) strcpy(newline,"\\\\");
+
+ if(format == FORMAT_TEXT){
+ strcpy(beginning,"Current records:");
+ strcpy(end,"");
+
+ for(int p=0; p<P; p++){
+ sprintf(beginningp[p],"exponent %2.1f:",exptype_to_double(exponents[p]));
+ strcpy(endp[p],"");
+ }
+
+ strcpy(newline,"");
+ }
+ else if(format == FORMAT_LATEX){
+ strcpy(beginning,"");
+ strcpy(end,"");
+
+ char h[1024];
+ strcpy(h,"{cc");
+ for(int n=0; n<N; n++) strcat(h,"c");
+ strcat(h,"}");
+ char f[1024];
+ strcpy(f,"$k$ & $r$ & $f$ ");
+ for(int n=1; n<N; n++) strcat(f,"& ");
+ strcat(f,"\\\\\n\\hline");
+ for(int p=0; p<P; p++){
+ sprintf(beginningp[p],"$p=%1.0f$:\n\n\\begin{tabular}%s\n%s",exptype_to_double(exponents[p]),h,f);
+ strcpy(endp[p],"\\end{tabular}\n");
+ }
+ strcpy(newline,"\\\\");
+ }
char s[STRING_SIZE];
- int l = 0;
- for(int k=0; k<=K; k++) for(int p=0; p<num_exponents[k]; p++){
- format_result(s, indeces[k][p], k, exponents[k][p], ratios[k][p], format);
- l += sprintf(text+l,"%s%s\n",s,newline);
+ int l = sprintf(text, "%s\n", beginning);
+ for(int p=0; p<P; p++){
+ l += sprintf(text+l, "%s\n", beginningp[p]);
+ for(int k=0; k<=K; k++){
+ format_result(s, indeces[k][p], k, exponents[p], ratios[k][p], format);
+ l += sprintf(text+l,"%s%s\n",s,newline);
+ }
+ if(format == FORMAT_LATEX){
+ /*Replace last \\ and \n by \n */
+ l -= 4;
+ l += sprintf(text+l,"\n");
+ }
+ l += sprintf(text+l, "%s\n", endp[p]);
}
- /*Remove last \\ and \n*/
- if(format == FORMAT_LATEX) text[l-4] = '\0';
+ l += sprintf(text+l, "%s\n", end);
}
-void print_records(int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P]){
+void print_records(EXPTYPE exponents[P], VALUETYPE ratios[K+1][P], int indeces[K+1][P]){
char s[STRING_SIZE];
- printf("Current records:\n");
- format_results(s, num_exponents, exponents, ratios, indeces, FORMAT_TEXT);
+ format_results(s, exponents, ratios, indeces, FORMAT_TEXT);
printf("%s\n",s);
}
-void print_latex_records_to_file(int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], char* filename){
- char h[1024];
- strcpy(h,"{ccc");
- for(int n=0; n<N; n++) strcat(h,"c");
- strcat(h,"}");
-
- char f[1024];
- strcpy(f,"$k$ & $p$ & $r$ & $f$ ");
- for(int n=1; n<N; n++) strcat(f,"& ");
- strcat(f,"\\\\\n\\hline");
-
+void print_latex_records_to_file(EXPTYPE exponents[P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], char* filename){
char s[STRING_SIZE];
- format_results(s, num_exponents, exponents, ratios, indeces, FORMAT_LATEX);
+ format_results(s, exponents, ratios, indeces, FORMAT_LATEX);
FILE *fptr;
fptr = fopen(filename, "w");
- fprintf(fptr, "\\begin{tabular}%s\n%s\n%s\n\\end{tabular}",h,f,s);
+ fprintf(fptr, "%s\n",s);
fclose(fptr);
}
-typedef struct { int num_exponents[K+1]; EXPTYPE exponents[K+1][P]; VALUETYPE (*records_ratio)[K+1][P]; int (*records_index)[K+1][P]; int num_thread; int* domain_current; int* cont; } Args;
+typedef struct { EXPTYPE exponents[P]; VALUETYPE (*records_ratio)[K+1][P]; int (*records_index)[K+1][P]; int num_thread; int* domain_current; int* cont; } Args;
/*Goes through all functions indexed by those numbers which equal the thread number module NUM_THREADS.*/
void* compute_chunk(void* arguments){
@@ -316,7 +345,7 @@ void* compute_chunk(void* arguments){
VALUETYPE f[N];
int d = 0;
while(d >= 0){
- d = compute(i, args -> num_exponents, args -> exponents, args -> records_ratio, args -> records_index);
+ d = compute(i, args -> exponents, args -> records_ratio, args -> records_index);
if(d > *domain_current){
*domain_current = d;
printf("Start considering length: %d\n",d);
@@ -329,25 +358,21 @@ void* compute_chunk(void* arguments){
int main() {
int num_exponents[K+1];
- EXPTYPE exponents[K+1][P];
- for(int k=0; k<=K; k++){
- num_exponents[k] = 1;
- exponents[k][0] = int_to_exptype(1);
- //exponents[k][1] = int_to_exptype(2);
- }
+ EXPTYPE exponents[P];
+ exponents[0] = int_to_exptype(1);
+ exponents[1] = int_to_exptype(2);
pthread_t threads[NUM_THREADS];
Args args[NUM_THREADS];
VALUETYPE records_ratio[K+1][P];
int records_index[K+1][P];
- for(int k=0; k<=K; k++) for(int p=0; p<num_exponents[k]; p++) records_ratio[k][p] = int_to_valuetype(0);
+ for(int k=0; k<=K; k++) for(int p=0; p<P; p++) records_ratio[k][p] = int_to_valuetype(0);
int domain_current = 0;
int result_code;
int cont = 0;
for (int i = 0; i < NUM_THREADS; i++) {
printf("In main: Creating thread %d.\n", i);
- memcpy(args[i].num_exponents,num_exponents,sizeof num_exponents);
memcpy(args[i].exponents,exponents,sizeof exponents);
args[i].records_ratio = &records_ratio;
args[i].records_index = &records_index;
@@ -363,13 +388,13 @@ int main() {
do {
getLine(prmpt, buff, sz);
if( 0 == strcmp(buff,"q") || 0 == strcmp(buff,"quit") || 0 == strcmp(buff,"exit") ){
- print_records(num_exponents,exponents,records_ratio,records_index);
+ print_records(exponents,records_ratio,records_index);
exit(EXIT_SUCCESS);
}
- else if( 0 == strcmp(buff,"r")) print_records(num_exponents,exponents,records_ratio,records_index);
+ else if( 0 == strcmp(buff,"r")) print_records(exponents,records_ratio,records_index);
else if( 0 == strcmp(buff,"t")){
getLine("Enter file name:\n", buff, sz);
- print_latex_records_to_file(num_exponents,exponents,records_ratio,records_index,buff);
+ print_latex_records_to_file(exponents,records_ratio,records_index,buff);
}
} while(cont < NUM_THREADS);
@@ -379,7 +404,7 @@ int main() {
printf("In main: Thread %d has ended.\n", i);
}
- print_records(num_exponents,exponents,records_ratio,records_index);
+ print_records(exponents,records_ratio,records_index);
return 0;
}