using caching in geometric product