version 1.2, 2000/01/16 07:55:40 |
version 1.8, 2020/10/06 11:33:46 |
|
|
/* $OpenXM$ */ |
/* $OpenXM: OpenXM/src/kan96xx/Kan/output.c,v 1.7 2011/10/05 05:46:14 takayama Exp $ */ |
#include <stdio.h> |
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <ctype.h> |
#include "datatype.h" |
#include "datatype.h" |
#include "stackm.h" |
#include "stackm.h" |
#include "extern.h" |
#include "extern.h" |
Line 17 struct outputQueue { |
|
Line 20 struct outputQueue { |
|
static void putstr(char *s,struct outputQueue *oq); |
static void putstr(char *s,struct outputQueue *oq); |
|
|
static void putstr(s,oq) |
static void putstr(s,oq) |
char *s; |
char *s; |
struct outputQueue *oq; |
struct outputQueue *oq; |
{ |
{ |
int i; |
int i; |
char **tmp; |
char **tmp; |
Line 51 struct outputQueue *oq; |
|
Line 54 struct outputQueue *oq; |
|
#define multStr(c) (c==' '?" ":(c=='\0'?"":"*")) |
#define multStr(c) (c==' '?" ":(c=='\0'?"":"*")) |
|
|
char *POLYToString(f,multSym,brace) |
char *POLYToString(f,multSym,brace) |
POLY f; |
POLY f; |
int multSym; |
int multSym; |
int brace; |
int brace; |
{ |
{ |
extern int Wrap; |
extern int Wrap; |
|
extern int UseDsmall; |
|
extern int COutput; |
int i,j,jj,fi; |
int i,j,jj,fi; |
int printed = 0; |
int printed = 0; |
int vi; /* index for variables */ |
int vi; /* index for variables */ |
|
|
printed = 1; |
printed = 1; |
xnames = dnames = (char **)NULL; |
xnames = dnames = (char **)NULL; |
}else{ |
}else{ |
ringp = f->m->ringp; xnames = f->m->ringp->x; dnames = f->m->ringp->D; |
ringp = f->m->ringp; xnames = f->m->ringp->x; |
|
if (UseDsmall) dnames = f->m->ringp->Dsmall; |
|
else dnames = f->m->ringp->D; |
n = ringp->n; |
n = ringp->n; |
xout = ringp->outputOrder; |
xout = ringp->outputOrder; |
} |
} |
|
|
/*print coefficient*/ |
/*print coefficient*/ |
if (fi == 0) { |
if (fi == 0) { |
if (isConstant(f)) { |
if (isConstant(f)) { |
putstr(coeffToString(f->coeffp),&oq); |
putstr(coeffToString(f->coeffp),&oq); |
}else if (isOne(f->coeffp)) { |
}else if (isOne(f->coeffp)) { |
/* do nothing */ |
/* do nothing */ |
}else if (isMinusOne(f->coeffp)) { |
}else if (isMinusOne(f->coeffp)) { |
putstr("-",&oq); |
putstr("-",&oq); |
}else{ |
}else{ |
putstr(coeffToString(f->coeffp),&oq); |
putstr(coeffToString(f->coeffp),&oq); |
putstr(multStr(multSym),&oq); |
putstr(multStr(multSym),&oq); |
} |
} |
}else{ |
}else{ |
if (isConstant(f)) { |
if (isConstant(f)) { |
if (isNegative(f->coeffp)) { |
if (isNegative(f->coeffp)) { |
putstr(coeffToString(f->coeffp),&oq); |
putstr(coeffToString(f->coeffp),&oq); |
}else{ |
}else{ |
putstr("+",&oq); |
putstr("+",&oq); |
putstr(coeffToString(f->coeffp),&oq); |
putstr(coeffToString(f->coeffp),&oq); |
} |
} |
} else if (isOne(f->coeffp)) { |
} else if (isOne(f->coeffp)) { |
putstr("+",&oq); |
putstr("+",&oq); |
}else if (isMinusOne(f->coeffp)) { |
}else if (isMinusOne(f->coeffp)) { |
putstr("-",&oq); |
putstr("-",&oq); |
}else{ |
}else{ |
if (!isNegative(f->coeffp)) putstr("+",&oq); |
if (!isNegative(f->coeffp)) putstr("+",&oq); |
putstr(coeffToString(f->coeffp),&oq); |
putstr(coeffToString(f->coeffp),&oq); |
putstr(multStr(multSym),&oq); |
putstr(multStr(multSym),&oq); |
} |
} |
} |
} |
|
|
for (jj=0; jj<n*2; jj++) { |
for (jj=0; jj<n*2; jj++) { |
j = xout[jj]; |
j = xout[jj]; |
if (j <n) { |
if (j <n) { |
if (f->m->e[j].x) { |
if (COutput) { |
vi++; |
if (f->m->e[j].x) { |
if (vi != 1) putstr(multStr(multSym),&oq); |
vi++; |
putstr(xnames[j],&oq); |
if (vi != 1) putstr(multStr(multSym),&oq); |
if (f->m->e[j].x >= 2) { |
if (f->m->e[j].x == 1) { |
putstr("^",&oq); |
putstr(xnames[j],&oq); |
putstr(intToString(f->m->e[j].x),&oq); |
} else { |
}else if (f->m->e[j].x < 0) { |
putstr("sm1power(",&oq); |
putstr("^(",&oq); |
putstr(xnames[j],&oq); |
putstr(intToString(f->m->e[j].x),&oq); |
putstr(",",&oq); |
putstr(")",&oq); |
putstr(intToString(f->m->e[j].x),&oq); |
} |
putstr(")",&oq); |
} |
} |
|
} |
|
}else{ |
|
if (f->m->e[j].x) { |
|
vi++; |
|
if (vi != 1) putstr(multStr(multSym),&oq); |
|
putstr(xnames[j],&oq); |
|
if (f->m->e[j].x >= 2) { |
|
putstr("^",&oq); |
|
putstr(intToString(f->m->e[j].x),&oq); |
|
}else if (f->m->e[j].x < 0) { |
|
putstr("^(",&oq); |
|
putstr(intToString(f->m->e[j].x),&oq); |
|
putstr(")",&oq); |
|
} |
|
} |
|
} |
}else { |
}else { |
j = j-n; |
if (COutput) { |
if (f->m->e[j].D) { |
j = j-n; |
vi++; |
if (f->m->e[j].D) { |
if (vi != 1) putstr(multStr(multSym),&oq); |
vi++; |
putstr(dnames[j],&oq); |
if (vi != 1) putstr(multStr(multSym),&oq); |
if (f->m->e[j].D >= 2) { |
if (f->m->e[j].D == 1) { |
putstr("^",&oq); |
putstr(dnames[j],&oq); |
putstr(intToString(f->m->e[j].D),&oq); |
}else { |
}else if (f->m->e[j].D < 0) { |
if (f->m->e[j].D) putstr("sm1power(",&oq); |
putstr("^(",&oq); |
putstr(dnames[j],&oq); |
putstr(intToString(f->m->e[j].D),&oq); |
putstr(",",&oq); |
putstr(")",&oq); |
putstr(intToString(f->m->e[j].D),&oq); |
} |
putstr(")",&oq); |
} |
} |
|
} |
|
}else{ |
|
j = j-n; |
|
if (f->m->e[j].D) { |
|
vi++; |
|
if (vi != 1) putstr(multStr(multSym),&oq); |
|
putstr(dnames[j],&oq); |
|
if (f->m->e[j].D >= 2) { |
|
putstr("^",&oq); |
|
putstr(intToString(f->m->e[j].D),&oq); |
|
}else if (f->m->e[j].D < 0) { |
|
putstr("^(",&oq); |
|
putstr(intToString(f->m->e[j].D),&oq); |
|
putstr(")",&oq); |
|
} |
|
} |
|
} |
} |
} |
} |
} |
fi++; |
fi++; |
|
|
} |
} |
|
|
char *KPOLYToString(f) |
char *KPOLYToString(f) |
POLY f; |
POLY f; |
{ |
{ |
extern int OutputStyle; |
extern int OutputStyle; |
return(POLYToString(f,OutputStyle,0)); |
return(POLYToString(f,OutputStyle,0)); |
} |
} |
|
|
isOne(c) |
int isOne(c) |
struct coeff *c; |
struct coeff *c; |
{ |
{ |
switch(c->tag) { |
switch(c->tag) { |
case INTEGER: |
case INTEGER: |
Line 207 struct coeff *c; |
|
Line 247 struct coeff *c; |
|
errorCoeff("not yet"); |
errorCoeff("not yet"); |
} |
} |
} |
} |
isMinusOne(c) |
int isMinusOne(c) |
struct coeff *c; |
struct coeff *c; |
{ |
{ |
switch(c->tag) { |
switch(c->tag) { |
case INTEGER: |
case INTEGER: |
Line 225 struct coeff *c; |
|
Line 265 struct coeff *c; |
|
} |
} |
|
|
} |
} |
isNegative(c) |
int isNegative(c) |
struct coeff *c; |
struct coeff *c; |
{ |
{ |
switch(c->tag) { |
switch(c->tag) { |
case INTEGER: |
case INTEGER: |
Line 244 struct coeff *c; |
|
Line 284 struct coeff *c; |
|
} |
} |
} |
} |
|
|
isConstant(f) |
int isConstant(f) |
POLY f; |
POLY f; |
{ |
{ |
int i; |
int i; |
int n; |
int n; |
|
|
return(1); |
return(1); |
} |
} |
|
|
|
int isConstantAll(POLY f) |
|
{ |
|
int i; |
|
int n; |
|
if (f == POLYNULL) return(1); |
|
while (f != POLYNULL) { |
|
if (!isConstant(f)) return 0; |
|
f = f->next; |
|
} |
|
return 1; |
|
} |
|
|
void errorOutput(s) |
void errorOutput(s) |
char *s; |
char *s; |
{ |
{ |
fprintf(stderr,"Error(output.c):%s\n",s); |
fprintf(stderr,"Error(output.c):%s\n",s); |
exit(15); |
exit(15); |
|
} |
|
|
|
char **makeDsmall(char **dvars,int n) { |
|
char **ans; |
|
int i; |
|
ans = (char **) sGC_malloc(sizeof(char *)*(n+1)); |
|
for (i=0; i<n; i++) { |
|
ans[i] = (char *) sGC_malloc(sizeof(char)*(strlen(dvars[i])+1)); |
|
strcpy(ans[i],dvars[i]); |
|
ans[i][0] = tolower(ans[i][0]); |
|
} |
|
ans[n] = NULL; |
|
return ans; |
} |
} |