![[Previous]](arrow1.gif) 
 ![[Up]](arrow2.gif) 
 
 ![[Next]](arrow3.gif) 
A Tour of NTL: Tips for Getting the Best Performance out of NTL
| ZZ InnerProduct(const ZZ *a, const ZZ *b, long n) { long i; ZZ res; for (i = 0; i < n; i++) res += a[i] * b[i]; return res; } | 
write this as
| ZZ InnerProduct(const ZZ *a, const ZZ *b, long n) { long i; ZZ res, t; for (i = 0; i < n; i++) { mul(t, a[i], b[i]); add(res, res, t); } return res; } | 
The first version of InnerProduct creates and destroys a temporary object, holding the value a[i]*b[i], in every loop iteration. The second does not.
![[Previous]](arrow1.gif) 
 ![[Up]](arrow2.gif) 
 
 ![[Next]](arrow3.gif)