procedure regress vector X vector Y
    float sumX; float sumY; float sumX2; float sumY2; float sumXY
    float sd; float slope; float intercept

    
    slope = ( sizeof(X) * (sumXY=sum(X*Y)) - sumX * (sumY=sum(Y)) )\
    		/ (sd = sizeof(X) * (sumX2=sum(X^2)) - (sumX=sum(X))^2)
    intercept = ( sumX2 * sumY - sumXY * sumX ) / sd
end

procedure regressPlot vector X vector Y
    vector lineX 2; vector lineY 2
    float scaleX 1; float scaleY 1; float shiftX 0; float shiftY 0
    call regress(X,Y)
    lineY[0] = regress.intercept + regress.slope * (lineX[0]=min(X))
    lineY[1] = regress.intercept + regress.slope * (lineX[1]=max(X))
    scaleX /= (lineX[1]-lineX[0])*1.2
    scaleY /= (max(Y)-min(Y))*1.2
    shiftX = -lineX[0]; shiftY = -lineY[0]
    plotlist lineX*scaleX+shiftX lineY*scaleY+shiftY line
    plotlist X*scaleX+shiftX Y*scaleY+shiftY +
end
