9 char factorial[] = {
'f',
'a',
'c',
't',
'o',
'r',
'i',
'a',
'l'};
15 cout<<
"N:";
for (
Int_t i=0;
i<mN;
i++) cout<<N[
i]<<
","; cout<<endl;
16 cout<<
"D:";
for (
Int_t i=0;
i<mD;
i++) cout<<D[
i]<<
","; cout<<endl;
24 cout <<
"NOM pointer: " << NOM;
25 cout<<
"| ";
for (
Int_t i=0;
i<mN;
i++) cout<<NOM[
i]<<
","; cout<<endl;
26 cout <<
"DEN pointer: " << DEN;
27 cout<<
"| ";
for (
Int_t i=0;
i<mD;
i++) cout<<DEN[
i]<<
","; cout<<endl;
38 if (strcmp(s,
"factorial")==0) {
43 if (N>D){Low=
D; High=N;}
47 for (
Int_t fac=Low+1; fac<=High; fac++) {
50 while (rest!=1 && fmax<NPRIMFIELD){
51 while (rest %
PRIMES[fmax] == 0) {
57 if (fmax>maxPrim) maxPrim=fmax;
61 DEN=
new Int_t[maxPrimDen];
62 for (
Int_t jp=0; jp<maxPrimDen; jp++) DEN[jp]=prim_vec[jp];
66 NOM=
new Int_t[maxPrimNom];
67 for (
Int_t jp=0; jp<maxPrimNom; jp++) NOM[jp]=prim_vec[jp];
76 cout <<
"Initializing with " << inom<<
","<< iden << endl;
78 NOM_INT = inom;
if (inom<0) NOM_INT=-inom;
79 DEN_INT = iden;
if (iden<0) DEN_INT=-iden;
107 if (inom<0) {sign_prefac *= -1; inom*=-1;}
108 if (iden<0) {sign_prefac *= -1; iden*=-1;}
110 if ( (inom>1000 || iden>1000) &&
115 cerr <<
"MAXPRIMSQUARED reached!!! NOM=" << inom <<
", DEN="
131 while (rest_nom!=1 && maxPrimNom<NPRIMFIELD){
132 while (rest_nom %
PRIMES[maxPrimNom] == 0) {
133 prim_vec_nom[maxPrimNom]++;
134 rest_nom /=
PRIMES[maxPrimNom];
149 while (rest_den!=1 && maxPrimDen<NPRIMFIELD){
150 while (rest_den %
PRIMES[maxPrimDen] == 0) {
151 prim_vec_den[maxPrimDen]++;
152 rest_den /=
PRIMES[maxPrimDen];
163 Int_t maxPrim=maxPrimNom;
164 if (maxPrimDen>maxPrim) maxPrim=maxPrimDen;
166 for (
Int_t ip=0; ip<maxPrim; ip++) {
167 if (prim_vec_nom[ip]!=0 && prim_vec_den[ip]!=0) {
168 if (prim_vec_den[ip] > prim_vec_nom[ip]) {
169 prim_vec_den[ip] -= prim_vec_nom[ip];
170 prim_vec_nom[ip] = 0;
173 prim_vec_nom[ip] -= prim_vec_den[ip];
174 prim_vec_den[ip] = 0;
182 if (prim_vec_nom[ip]!=0) maxPrimNom=ip+1;
183 if (prim_vec_den[ip]!=0) maxPrimDen=ip+1;
187 NOM=
new Int_t[maxPrimNom];
188 for (
Int_t jp=0; jp<maxPrimNom; jp++) NOM[jp]=prim_vec_nom[jp];
194 DEN=
new Int_t[maxPrimDen];
195 for (
Int_t jp=0; jp<maxPrimDen; jp++) DEN[jp]=prim_vec_den[jp];
208 if (sign_prefac==0) {
216 if (maxPrimNom<0 && maxPrimDen<0){
222 Int_t ip=maxPrimNom-1;
223 while (ip>=0 && NOM[ip]==0) { maxPrimNom=ip; ip--;}
227 while (ip>=0 && DEN[ip]==0) { maxPrimDen=ip; ip--;}
230 while (ipn<maxPrimNom) {
231 for (
Int_t jj=0; jj<NOM[ipn]; jj++) NOM_INT *=
PRIMES[ipn];
235 while (ipd<maxPrimDen) {
236 for (
Int_t jj=0; jj<DEN[ipd]; jj++) DEN_INT *=
PRIMES[ipd];
247 Int_t maxPD=maxPrimDen;
253 while (ppot-- > 0) comdiv*=
PRIMES[
i];
272 cerr <<
"Error in TFracNum::SumSignedRoots()" << endl
273 <<
"this:" << this->Dval() << endl;
275 cerr <<
"b:" << b->Dval() << endl;
282 if (sign_prefac==0||NOM_INT==0)
return true;
286 if (NOM[
i]%2) { sqrt_ok=0;
break; }
288 for (
Int_t i=0; i<maxPrimDen; i++)
289 if (DEN[i]%2) { sqrt_ok=0;
break; }
291 cout <<
"square root not possible for this fracnum :(" <<endl;
295 for (
Int_t i=0;
i<maxPrimNom;
i++)
if (NOM[
i]%2)
return false;
296 for (
Int_t i=0; i<maxPrimDen; i++)
if (DEN[i]%2)
return false;
297 for (
Int_t i=0; i<maxPrimNom; i++) NOM[i]/=2;
298 for (
Int_t i=0; i<maxPrimDen; i++) DEN[i]/=2;
312 if (sign_prefac==0)
return true;
314 if (NOM_INT<0) NOM_INT*=-1;
315 if (dvalue<0) dvalue*=-1.0;
321 if (sign_prefac==-7777) {
339 Int_t MPN=maxPrimNom;
340 maxPrimNom=maxPrimDen;
351 if (dvalue<0)
return -1;
357 if (sign_prefac==0 && b.
sign_prefac==0)
return true;
362 if (NOM[
i]!=b.
NOM[
i])
return false;
364 if (DEN[
i]!=b.
DEN[
i])
return false;
371 cout <<
"Both zero, they are equal."<<endl;
return true;
374 cout <<
"Different sign: "
379 cout <<
"Different maxPrimNom: "
384 cout <<
"Different maxPrimDen: "
389 if (NOM[
i]!=b.
NOM[
i]){
390 cout <<
"Different numerator contribution at prime "<<
i<<
": "
391 <<NOM[
i]<<
"!="<<b.
NOM[
i]<<endl;
395 if (DEN[
i]!=b.
DEN[
i]) {
396 cout <<
"Different denominator contribution at prime "<<
i<<
": "
397 <<DEN[
i]<<
"!="<<b.
DEN[
i]<<endl;
400 cout <<
"Well, they're simply equal!" << endl;
406 char* hstr =
new char[30];
407 if (sign_prefac==0) {sprintf(hstr,
"{0,1}");
return hstr;}
408 if (sign_prefac==-7777) {sprintf(hstr,
"{1,0}");
return hstr;}
409 if (sign_prefac==-6666) {sprintf(hstr,
"{0,0}");
return hstr;}
410 if (sign_prefac==1) sprintf(hstr,
"{%lld,%lld}", NOM_INT, DEN_INT);
411 else sprintf(hstr,
"{%lld,%lld}", -NOM_INT, DEN_INT);
417 if (dvalue>b.
dvalue)
return true;
425 Int_t den_cdiv=DenomCommonDivisor(b);
427 Int_t adc= DEN_INT/den_cdiv;
428 return TFracNum(sign_prefac * NOM_INT*bdc+
443 if ( (sign_prefac==-7777 && b.
sign_prefac == 0 ) ||
448 if ( (sign_prefac==-7777 || b.
sign_prefac == -7777) )
454 Int_t maxPrimNom_ = maxPrimNom;
456 Int_t maxPrimDen_ = maxPrimDen;
458 Int_t maxPrim=maxPrimNom_;
459 if (maxPrimDen_>maxPrim) maxPrim=maxPrimDen_;
461 Int_t prim_vec_nom[maxPrim];
462 Int_t prim_vec_den[maxPrim];
464 for (
Int_t ip=0; ip<maxPrim; ip++) {
467 if ( maxPrimNom>ip) prim_vec_nom[ip]+= NOM[ip];
469 if ( maxPrimDen>ip) prim_vec_den[ip]+= DEN[ip];
473 for (
Int_t ip=0; ip<maxPrim; ip++) {
474 if (prim_vec_nom[ip]!=0 && prim_vec_den[ip]!=0) {
475 if (prim_vec_den[ip] > prim_vec_nom[ip]) {
476 prim_vec_den[ip] -= prim_vec_nom[ip];
477 prim_vec_nom[ip] = 0;
480 prim_vec_nom[ip] -= prim_vec_den[ip];
481 prim_vec_den[ip] = 0;
486 for (
Int_t ip=0; ip<maxPrim; ip++) {
487 if (prim_vec_nom[ip]!=0) maxPrimNom_=ip+1;
488 if (prim_vec_den[ip]!=0) maxPrimDen_=ip+1;
492 for (
Int_t jp=0; jp<maxPrimNom_; jp++) NOM_[jp]=prim_vec_nom[jp];
495 for (
Int_t jp=0; jp<maxPrimDen_; jp++) DEN_[jp]=prim_vec_den[jp];
498 cout <<
" Initial with maxN=" << maxPrimNom_<<
", maxD="
499 << maxPrimDen_<<
", "<< NOM_<<
", "<< DEN_<<
", "<<
502 for (
Int_t i=0;
i<maxPrimNom_;
i++) cout<<NOM_[
i]<<
","; cout<<endl;
504 for (
Int_t i=0;
i<maxPrimDen_;
i++) cout<<DEN_[
i]<<
","; cout<<endl;
506 return TFracNum(maxPrimNom_, maxPrimDen_, NOM_, DEN_,
513 cout <<
"nom prime list: " << maxPrimNom <<
",pointer "<< NOM << endl;
514 cout <<
"den prime list: " << maxPrimDen <<
",pointer "<< DEN << endl;
516 for (
Int_t i=0;
i<maxPrimNom;
i++) cout<<NOM[
i]<<
","; cout<<endl;
518 for (
Int_t i=0;
i<maxPrimDen;
i++) cout<<DEN[
i]<<
","; cout<<endl;
520 cout<<
"sign_prefac="<<sign_prefac<<endl;
522 if (sign_prefac<0) cout <<
"-";
523 cout << -maxPrimNom <<
"/" << -maxPrimDen << endl;
527 for (
Int_t i=0; i<maxPrimNom; i++) if (NOM[i]<0 || NOM[i]>1000) integrity=0;
528 for (
Int_t i=0; i<maxPrimDen; i++) if (DEN[i]<0 || DEN[i]>1000) integrity=0;
529 if (integrity==0)
return -1;
533 if (sign_prefac<0) cout <<
"-NOM = ";
534 else cout <<
" NOM = ";
536 while (ipn<maxPrimNom) {
538 cout <<
PRIMES[ipn] <<
"^" << NOM[ipn];
541 for (
Int_t jj=0; jj<NOM[ipn]; jj++) nom *=
PRIMES[ipn];
543 if (!FirstTerm && ipn<maxPrimNom && NOM[ipn]!=0) cout <<
" * ";
545 cout <<
" = " << nom << endl;
551 while (ipd<maxPrimDen) {
553 cout <<
PRIMES[ipd] <<
"^" << DEN[ipd];
556 for (
Int_t jj=0; jj<DEN[ipd]; jj++) den *=
PRIMES[ipd];
558 if (!FirstTerm && ipd<maxPrimDen && DEN[ipd]!=0) cout <<
" * ";
560 cout <<
" = " << den << endl;
561 cout <<
"NOM_INT="<<NOM_INT<<endl;
562 cout <<
"DEN_INT="<<DEN_INT<<endl;
563 cout <<
"dvalue="<<dvalue<<endl;
569 cerr <<
"nom prime list: " << maxPrimNom <<
",pointer "<< NOM << endl;
570 cerr <<
"den prime list: " << maxPrimDen <<
",pointer "<< DEN << endl;
572 for (
Int_t i=0;
i<maxPrimNom;
i++) cerr<<NOM[
i]<<
","; cerr<<endl;
574 for (
Int_t i=0;
i<maxPrimDen;
i++) cerr<<DEN[
i]<<
","; cerr<<endl;
575 cerr<<
"sign_prefac="<<sign_prefac<<endl;
577 if (sign_prefac<0) cerr <<
"-";
578 cerr << -maxPrimNom <<
"/" << -maxPrimDen << endl;
582 for (
Int_t i=0; i<maxPrimNom; i++) if (NOM[i]<0 || NOM[i]>1000) integrity=0;
583 for (
Int_t i=0; i<maxPrimDen; i++) if (DEN[i]<0 || DEN[i]>1000) integrity=0;
584 if (integrity==0)
return -1;
588 if (sign_prefac<0) cerr <<
"-NOM = ";
589 else cerr <<
" NOM = ";
591 while (ipn<maxPrimNom) {
593 cerr <<
PRIMES[ipn] <<
"^" << NOM[ipn];
596 for (
Int_t jj=0; jj<NOM[ipn]; jj++) nom *=
PRIMES[ipn];
598 if (!FirstTerm && ipn<maxPrimNom && NOM[ipn]!=0) cerr <<
" * ";
600 cerr <<
" = " << nom << endl;
606 while (ipd<maxPrimDen) {
608 cerr <<
PRIMES[ipd] <<
"^" << DEN[ipd];
611 for (
Int_t jj=0; jj<DEN[ipd]; jj++) den *=
PRIMES[ipd];
613 if (!FirstTerm && ipd<maxPrimDen && DEN[ipd]!=0) cerr <<
" * ";
615 cerr <<
" = " << den << endl;
616 cerr <<
"NOM_INT="<<NOM_INT<<endl;
617 cerr <<
"DEN_INT="<<DEN_INT<<endl;
618 cerr <<
"dvalue="<<dvalue<<endl;
624 char *formstr=
new char[50];
625 char *fstr=
new char[100];
629 else if (DEN_INT==1) {
631 sprintf(fstr, formstr, sign_prefac<0 ?
'-':
'+', NOM_INT);
635 sprintf(fstr, formstr, sign_prefac<0 ?
'-':
'+', NOM_INT, DEN_INT);
644 char *formstr=
new char[50];
645 char *fstr=
new char[200];
651 Int_t SQRT_NOM_INT=1;
652 Int_t NOM_INT_REST=1;
653 while (ipn<maxPrimNom) {
654 for (
Int_t jj=0; jj<NOM[ipn]/2; jj++) SQRT_NOM_INT *=
PRIMES[ipn];
655 if (NOM[ipn]%2) NOM_INT_REST *=
PRIMES[ipn];
659 Int_t SQRT_DEN_INT=1;
660 Int_t DEN_INT_REST=1;
661 while (ipd<maxPrimDen) {
662 for (
Int_t jj=0; jj<DEN[ipd]/2; jj++) SQRT_DEN_INT *=
PRIMES[ipd];
663 if (DEN[ipd]%2) DEN_INT_REST *=
PRIMES[ipd];
667 char *sqrtstr=
new char[100];
670 if (SQRT_DEN_INT==1) {
671 if (SQRT_NOM_INT==1) {
677 sprintf(sqrtstr, formstr, SQRT_NOM_INT);
682 sprintf(sqrtstr,formstr, SQRT_NOM_INT, SQRT_DEN_INT);
685 char *reststr=
new char[100];
686 if (DEN_INT_REST==1) {
687 if (NOM_INT_REST==1) {
693 sprintf(reststr, formstr, NOM_INT_REST);
698 sprintf(reststr, formstr, NOM_INT_REST, DEN_INT_REST);
701 if (one1&&one2) sprintf(sqrtstr,
"1");
702 sprintf(fstr,
"%c%s%s", sign_prefac<0 ?
'-':
'+', sqrtstr, reststr);
707 Int_t kappa = (J-m) % 2;
708 cout <<
"kappa=" << kappa << endl;
709 Int_t nom_ptr[1]={1};
710 TFracNum twofac(kappa, 0, nom_ptr, 0, 1);
711 TFracNum fac1(J+m, 2*J,
"factorial");
713 return twofac*fac1*fac2;
717 Int_t nom_ptr[1]={m0};
718 TFracNum twofac(1, 0, nom_ptr, 0, 1);
719 TFracNum fac1(J+m, 2*J,
"factorial");
721 return twofac*fac1*fac2;
725 if (ell==0)
return TFracNum(0,0,0,0,1);
726 Int_t nom_ptr[1]={ell};
727 TFracNum two_to_ell(1, 0, nom_ptr, 0, 1);
729 TFracNum fac2(ell, 2*ell,
"factorial");
730 return two_to_ell*fac1*fac2;
734 if (ell==0)
return TFracNum(0,0,0,0,1);
735 Int_t nom_ptr[1]={(ell+m0)/2};
736 TFracNum two_to_ell(1, 0, nom_ptr, 0, 1);
738 TFracNum fac2(ell, 2*ell,
"factorial");
739 return two_to_ell*fac1*fac2;
744 if (ell==0)
return TFracNum(0,0,0,0,1);
745 Int_t nom_ptr[1]={(ell+m0)};
746 TFracNum two_to_ell(1, 0, nom_ptr, 0, 1);
747 TFracNum fac1a(ell, 1,
"factorial");
748 TFracNum fac1b(ell, 1,
"factorial");
749 TFracNum fac2a(ell, 2*ell,
"factorial");
750 TFracNum fac2b(ell, 2*ell,
"factorial");
751 return two_to_ell*fac1a*fac1b*fac2a*fac2b;