Index: trunk/psLib/src/dataManip/psMinimize.c
===================================================================
--- trunk/psLib/src/dataManip/psMinimize.c	(revision 1191)
+++ trunk/psLib/src/dataManip/psMinimize.c	(revision 1192)
@@ -588,36 +588,21 @@
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
 /******************************************************************************
-p_psBuildSums1D(x, sums, polyOrder): this routine calculates the powers of
+p_psBuildSums1D(x, polyOrder, sums): this routine calculates the powers of
 input parameter "x" between 0 and input parameter polyOrder.  The result is
-returned as a psVector.
+returned as a psVector sums.
  *****************************************************************************/
-psVector *p_psBuildSums1D(double x,
-                          int polyOrder)
+void p_psBuildSums1D(double x,
+                     int polyOrder,
+                     psVector *sums)
 {
     int       i = 0;
     double    xSum = 0.0;
-    psVector *sums = NULL;
-
-    sums = psVectorAlloc(polyOrder+1, PS_TYPE_F32);
+
     xSum = 1.0;
     for(i=0;i<=polyOrder;i++) {
-        sums->data.F32[i] = xSum;
+        sums->data.F64[i] = xSum;
         xSum*= x;
     }
-    return(sums);
 }
 
@@ -639,4 +624,5 @@
         imageScalingFactors->data.F32[i] = (((float) 2*i) / ((float) x)) - 1.0;
     }
+
     return(imageScalingFactors);
 }
@@ -761,4 +747,5 @@
     int j = 0;
     int k = 0;
+    psVector *xSums = NULL;
 
     if (x->n != y->n) {
@@ -769,10 +756,11 @@
     }
 
-    A = psImageAlloc(polyOrder, polyOrder, PS_TYPE_F64);
-    ALUD = psImageAlloc(polyOrder, polyOrder, PS_TYPE_F64);
-    B = psVectorAlloc(polyOrder, PS_TYPE_F64);
-    coeffs = psVectorAlloc(polyOrder, PS_TYPE_F64);
-    X = psVectorAlloc(x->n, PS_TYPE_F64);
+    A       = psImageAlloc(polyOrder, polyOrder, PS_TYPE_F64);
+    ALUD    = psImageAlloc(polyOrder, polyOrder, PS_TYPE_F64);
+    B       = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    coeffs  = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    X       = psVectorAlloc(x->n, PS_TYPE_F64);
     outPerm = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    xSums   = psVectorAlloc(1+2*polyOrder, PS_TYPE_F64);
 
     // Initialize data structures.
@@ -791,14 +779,14 @@
 
     // Build the B and A data structs.
-    for(k=0;k<(polyOrder);k++) {
-        for (i=0;i<X->n;i++) {
-            B->data.F64[k]+= y->data.F64[i] * (pow(X->data.F64[i], (float) k));
-        }
-    }
-
-    for(k=0;k<(polyOrder);k++) {
-        for(j=0;j<(polyOrder);j++) {
-            for (i=0;i<X->n;i++) {
-                A->data.F64[k][j]+= pow(X->data.F64[i], (float) (k + j));
+    for (i=0;i<X->n;i++) {
+        p_psBuildSums1D(X->data.F64[i], 2*polyOrder, xSums);
+
+        for(k=0;k<(polyOrder);k++) {
+            B->data.F64[k]+= y->data.F64[i] * xSums->data.F64[k];
+        }
+
+        for(k=0;k<(polyOrder);k++) {
+            for(j=0;j<(polyOrder);j++) {
+                A->data.F64[k][j]+= xSums->data.F64[k+j];
             }
         }
@@ -818,4 +806,5 @@
     psFree(X);
     psFree(outPerm);
+    psFree(xSums);
 
     return(NULL);
