[GiNaC-devel] Problems with dummy summation

Vladimir Kisil kisilv at maths.leeds.ac.uk
Fri May 13 17:27:25 CEST 2005


		Dear All,

		I recently noticed that GiNaC incorrectly expands products with
  dummy index summations, which is illustrated by the following program:

#include <iostream>
#include <ginac/ginac.h>
using namespace std;
using namespace GiNaC;
#include <stdexcept>

int main(){
	realsymbol a("a"), b("b"), c("c"), d("d");
	varidx mu(symbol("mu", "\\mu"), 2);
	try {
		ex e;
		e = (indexed(a, mu)*indexed(b, mu.toggle_variance())+1)*indexed(c, mu)*indexed(d, mu.toggle_variance());
		cout << e.expand() << endl;
		// -> d.mu*c~mu*b.mu*a~mu+d.mu*c~mu

		e = pow(indexed(a, mu)*indexed(b, mu.toggle_variance())+1, 2);
		cout << e.expand() << endl;
		// -> 1+2*b.mu*a~mu+(b.mu)^2*(a~mu)^2
	} catch  (exception &p) {
			cerr << "Got problem: " <<  p.what() << endl;
	}
}

  I made a patch to mul.cpp, ncmul.cpp, power.cpp which _partially_ fix
  this problem. The bigger test looks now like that:

#include <iostream>
#include <ginac/ginac.h>
using namespace std;
using namespace GiNaC;
#include <stdexcept>

int main(){
	realsymbol a("a"), b("b"), c("c"), d("d");
	varidx mu(symbol("mu", "\\mu"), 2),  nu(symbol("nu", "\\nu"), 2);
	try {
		ex e;
		e = (indexed(a, mu)*indexed(b, mu.toggle_variance())+1)*indexed(c, mu)*indexed(d, mu.toggle_variance());
		cout << e.expand() << endl << endl;
		// -> d.mu*c~mu*b.symbol6*a~symbol6+d.mu*c~mu

		e = indexed(c, mu)*indexed(d, mu.toggle_variance())*(indexed(a, mu)*indexed(b, mu.toggle_variance())+1);
		cout << e.expand() << endl << endl;
		// -> d.mu*c~mu+d.mu*a~symbol7*b.symbol7*c~mu

		e = (1+indexed(c, mu)*indexed(d, mu.toggle_variance()))*(indexed(a, mu)*indexed(b, mu.toggle_variance())+1);
		cout << e.expand() << endl << endl;
		// -> 1+b.mu*a~mu+b.mu*c~symbol8*a~mu*d.symbol8+d.mu*c~mu

		e = pow(2*indexed(a, mu)*indexed(b, mu.toggle_variance())+1, 2);
		cout << e.expand() << endl << endl;
		// -> 1+4*b.mu*a~mu*b.symbol9*a~symbol9+4*b.mu*a~mu

		e = pow(2*indexed(a, mu)*indexed(b, mu.toggle_variance())+1, 3);
		cout << e.expand() << endl << endl;
		// -> 1+6*b.mu*a~mu+12*b.mu*a~mu*a~symbol10*b.symbol10+8*b.symbol12*a~symbol12*b.mu*a~symbol11*b.symbol11*a~mu

		e = (indexed(a, mu, nu)*dirac_gamma(mu.toggle_variance()) * dirac_gamma(nu.toggle_variance()) + dirac_ONE()) 
			* indexed(b, mu, nu)*dirac_gamma(mu.toggle_variance()) * dirac_gamma(nu.toggle_variance());
		cout << e.expand() << endl << endl;
		// -> (gamma.mu*gamma.nu*gamma.mu*gamma.nu)*a~mu~nu*b~mu~nu+(gamma.mu*gamma.nu)*b~mu~nu

		e = (indexed(a, mu, nu)*dirac_gamma(mu.toggle_variance()) * dirac_gamma(nu.toggle_variance()) + dirac_ONE()) 
			*( indexed(b, mu, nu)*dirac_gamma(mu.toggle_variance()) * dirac_gamma(nu.toggle_variance()) + dirac_ONE());
		cout << e.expand() << endl << endl;
		// -> b~symbol16~symbol17*a~mu~nu*(gamma.mu*gamma.nu*gamma.symbol16*gamma.symbol17)+ONE+(gamma.mu*gamma.nu)*a~mu~nu+(gamma.mu*gamma.nu)*b~mu~nu

		e = (indexed(a, mu, nu)*dirac_gamma(mu.toggle_variance()) * dirac_gamma(nu.toggle_variance()) + dirac_ONE()) 
			* indexed(b, mu.toggle_variance(), nu.toggle_variance())*dirac_gamma(mu) * dirac_gamma(nu);
		cout << e.expand() << endl << endl;
		// -> (gamma.mu*gamma.nu*gamma~mu*gamma~nu)*a~mu~nu*b.mu.nu+(gamma~mu*gamma~nu)*b.mu.nu

		e = pow(indexed(a, mu, nu)*dirac_gamma(mu.toggle_variance()) * dirac_gamma(nu.toggle_variance()), 2);
		cout << e.expand() << endl << endl;
		// -> (gamma.mu*gamma.nu*gamma.symbol18*gamma.symbol19)*a~mu~nu*a~symbol18~symbol19

		e = pow(2*indexed(a, mu, nu)*dirac_gamma(mu.toggle_variance()) * dirac_gamma(nu.toggle_variance())+dirac_ONE(), 2);
		cout << e.expand() << endl << endl;
		// -> 4*(gamma.mu*gamma.nu*gamma.symbol18*gamma.symbol19)*a~mu~nu*a~symbol18~symbol19+ONE+4*(gamma.mu*gamma.nu)*a~mu~nu

		e = pow(2*indexed(a, mu, nu)*dirac_gamma(mu.toggle_variance()) * dirac_gamma(nu.toggle_variance())+dirac_ONE(), 3);
		cout << e.expand() << endl << endl;
		// -> ONE+8*a~symbol26~symbol27*a~mu~nu*a~symbol28~symbol29*(gamma.mu*gamma.nu*gamma.symbol26*gamma.symbol27*gamma.symbol28*gamma.symbol29)+6*(gamma.mu*gamma.nu)*a~mu~nu+4*(gamma.mu*gamma.nu*gamma.symbol24*gamma.symbol25)*a~mu~nu*a~symbol24~symbol25+4*a~symbol22~symbol23*a~mu~nu*(gamma.mu*gamma.nu*gamma.symbol22*gamma.symbol23)+4*a~symbol20~symbol21*a~mu~nu*(gamma.mu*gamma.nu*gamma.symbol20*gamma.symbol21)
	} catch  (exception &p) {
			cerr << "Got problem: " <<  p.what() << endl;
	}
}
  
  So the problem remains in the cases when one dummy index belongs to
  non-commutative part of product and other---to a commutative part. I do
  not know how to fix this situation in a simple way.

  I sent my patch as an attachment to a separate letter to this list
  (which will be likely hold till moderator's  approval). It includes as
  well a slightly redesigned version of my previous patch for indexed.cpp
  and clifford.cpp (from the Thu Apr 28 18:17:55 CEST 2005).

  Best regards,
  Vladimir

-- 
Vladimir V. Kisil     email: kisilv at maths.leeds.ac.uk
--                      www: http://maths.leeds.ac.uk/~kisilv/




More information about the GiNaC-devel mailing list