changeset 884:1eb91fa57b97 octave-forge

Add sqrt over galois field, code cleanup, some optimization and html version of docs
author adb014
date Tue, 01 Apr 2003 19:37:15 +0000
parents 125a742f9169
children 1ea43ea20fcb
files main/comm/INDEX main/comm/Makefile main/comm/awgn.png main/comm/comms.m main/comm/comms.txi main/comm/eyediagram.m main/comm/eyediagram.png main/comm/galois-def.h main/comm/galois.cc main/comm/galois.h main/comm/gf.cc main/comm/gftable.m main/comm/ov-galois.cc main/comm/rsdecof.m main/comm/rsencof.m main/comm/scatterplot.m main/comm/scatterplot.png
diffstat 17 files changed, 448 insertions(+), 349 deletions(-) [+]
line wrap: on
line diff
--- a/main/comm/INDEX	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/INDEX	Tue Apr 01 19:37:15 2003 +0000
@@ -57,7 +57,7 @@
  rcosiir
  rcosine
  rcosfir
-Galois Fields
+Galois Fields of Even Characateristic
  + - = Addition and subtraction in a Galois Field.
  * / \ = Matrix multiplication and division of Galois arrays.
  .* ./ .\ = Element by element multiplication and division of Galois arrays.
@@ -86,6 +86,7 @@
  glog
  glu
  gprod
+ gsqrt
  grank
  greshape
  groots
--- a/main/comm/Makefile	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/Makefile	Tue Apr 01 19:37:15 2003 +0000
@@ -2,6 +2,7 @@
 
 MAKEINFO = makeinfo --no-split
 TEXI2DVI = texi2dvi --clean
+TEXI2HTML = texi2html -split_chapter
 DVIPS = dvips
 
 GALOISTARGET = gf.oct
@@ -10,9 +11,9 @@
 	      ov-galois.cc 
 GALOISOBJECTS = $(patsubst %.cc,%.o,$(GALOISSOURCES))
 GALOISLINKTARGETS = isgalois.oct gdiag.oct greshape.oct gprod.oct gsum.oct \
-                    gsumsq.oct glog.oct gexp.oct gfilter.oct glu.oct ginv.oct \
-                    ginverse.oct gdet.oct grank.oct rsenc.oct rsdec.oct \
-                    bchenco.oct bchdeco.oct
+                    gsumsq.oct gsqrt.oct glog.oct gexp.oct gfilter.oct \
+                    glu.oct ginv.oct ginverse.oct gdet.oct grank.oct \
+                    rsenc.oct rsdec.oct bchenco.oct bchdeco.oct
 
 GALOISDEPENDS = $(patsubst %.cc,%.d,$(GALOISSOURCES))
 OTHERSOURCES = primpoly.cc isprimitive.cc _errcore.cc cyclpoly.cc cyclgen.cc \
@@ -86,6 +87,10 @@
 	@echo "Making info $@"; \
 	$(MAKEINFO) $< 
 
+%.html : %.texi
+	@echo "Making html $@"; \
+	$(TEXI2HTML) $< ; \
+
 %.texi : %.txi
 	@echo "Making texinfo $@"; \
 	$(RM) -f $@; \
Binary file main/comm/awgn.png has changed
--- a/main/comm/comms.m	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/comms.m	Tue Apr 01 19:37:15 2003 +0000
@@ -443,7 +443,7 @@
 	gmat = gf(reshape(mod([0:matlen*matlen-1],2^m),matlen,matlen),m);
 	fprintf("PASSED\n");
 	fprintf("  Access Galois structures:                 ");
-	if (gcol.m ~= m || gcol.prim_poly ~= primpoly(m,"min", ...
+	if (gcol.m != m || gcol.prim_poly != primpoly(m,"min", ...
                                                       "nodisplay"))
           error("FAILED");
 	endif
@@ -462,39 +462,47 @@
           error("FAILED");
 	endif
 	tmp = gdiag(grow);
-	if (size(tmp,1) ~= 2^m || size(tmp,2) ~= 2^m)
+	if (size(tmp,1) != 2^m || size(tmp,2) != 2^m)
           error("FAILED");
 	endif
 	for i=1:2^m
           for j=1:2^m
             if ((i == j) && (tmp(i,j) != grow(i)))
               error("FAILED");
-            elseif ((i ~= j) && (tmp(i,j) ~= 0))
+            elseif ((i != j) && (tmp(i,j) != 0))
               error("FAILED");
             endif
           end
 	end
 	tmp = gdiag(gmat);
-	if (length(tmp) ~= matlen)
+	if (length(tmp) != matlen)
           error("FAILED");
 	endif
 	for i=1:matlen
-          if (gmat(i,i) ~= tmp(i))
+          if (gmat(i,i) != tmp(i))
             error("FAILED");
           endif
 	end          
 	tmp = greshape(gmat,prod(size(gmat)),1);
-	if (length(tmp) ~= prod(size(gmat)))
+	if (length(tmp) != prod(size(gmat)))
+          error("FAILED");
+	endif
+	if (gexp(glog(gf([1:n],m))) != [1:n])
           error("FAILED");
 	endif
+	tmp = gsqrt(gmat);
+	if (tmp .* tmp != gmat)
+          error("FAILED");
+	endif
+
 	fprintf("PASSED\n");
 	fprintf("  Unary operators:                          ");
 	tmp = - grow;
-	if (tmp ~= grow)
+	if (tmp != grow)
           error("FAILED");
 	endif
 	tmp = !grow;
-	if (tmp(1) ~= 1)
+	if (tmp(1) != 1)
           error("FAILED");
 	endif
 	if (any(tmp(2:length(tmp))))
@@ -503,7 +511,7 @@
 	tmp = gmat';
 	for i=1:size(gmat,1)
           for j=1:size(gmat,2)
-            if (gmat(i,j) ~= tmp(j,i))
+            if (gmat(i,j) != tmp(j,i))
               error("FAILED");
             endif
           end
@@ -517,25 +525,25 @@
 	elsqr = gcol .* gcol;
 	elsqr2 = gcol .^ gf(2,m);
 	for i=1:length(elsqr)
-          if (elsqr(i) ~= multbl(i,i))
+          if (elsqr(i) != multbl(i,i))
             error("FAILED");
           endif
 	end
 	for i=1:length(elsqr)
-          if (elsqr(i) ~= elsqr2(i))
+          if (elsqr(i) != elsqr2(i))
             error("FAILED");
           endif
 	end
 	tmp = grow(2:length(grow)) ./ gcol(2:length(gcol))';
-	if (length(tmp) ~= n || any(tmp ~= ones(1,length(grow)-1)))
+	if (length(tmp) != n || any(tmp != ones(1,length(grow)-1)))
           error("FAILED");
 	endif
 	fprintf("PASSED\n");
 	fprintf("  Logical operators:                        ");
-	if (grow(1) ~= gzero || grow(2) ~= gone || grow(2^m) ~= n)
+	if (grow(1) != gzero || grow(2) != gone || grow(2^m) != n)
           error("FAILED");
 	endif
-	if (!(grow(1) == gzero) || any(grow ~= gcol'))
+	if (!(grow(1) == gzero) || any(grow != gcol'))
           error("FAILED");
 	endif
 	fprintf("PASSED\n");
--- a/main/comm/comms.txi	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/comms.txi	Tue Apr 01 19:37:15 2003 +0000
@@ -298,7 +298,8 @@
 @iftex
 which produces a sine-wave with noise added as seen in Figure 1.
 
-@center @image{awgn}
+@center @image{awgn, , }
+
 @center Figure 1: Sine-wave with 10dB signal-to-noise ratio
 @end iftex
 
@@ -426,7 +427,8 @@
 which produces a eye-diagram of a noisy signal as seen in Figure 2. Similarly
 an example of the use of the function @dfn{scatterplot} is
 
-@center @image{eyediagram}
+@center @image{eyediagram, , }
+
 @center Figure 2: Eye-diagram of a QPSK like signal with 15dB signal-to-noise ratio
 @end iftex
 @ifinfo
@@ -450,13 +452,24 @@
 @iftex
 which produces a scatterplot of a noisy signal as seen in Figure 3.
 
-@center @image{scatterplot}
+@center @image{scatterplot, , }
+
 @center Figure 3: Scatterplot of a QPSK like signal with 15dB signal-to-noise ratio
 @end iftex
 
 @node Source Coding, Block Coding, Random Signals, Top
 @chapter Source Coding
 
+@menu
+* Quantization::
+* PCM Coding::
+* Arithmetic Coding::
+* Dynamic Range Compression::
+@end menu
+
+@node Quantization, PCM Coding, , Source Coding
+@section Quantization
+
 An important aspect of converting an analog signal to the digital domain
 is quantization. This is the process of mapping a continuous signal to a
 set of defined values. Octave contains two functions to perform quantization,
@@ -510,11 +523,23 @@
 signal to be quantized, then the parititioning suggested by @dfn{lloyds}
 will be sub-optimal.
 
+@node PCM Coding, Arithmetic Coding, Quantization, Source Coding
+@section PCM Coding
+
 The DPCM function @dfn{dpcmenco}, @dfn{dpcmdeco} and @dfn{dpcmopt}
 implement a form of preditive quantization, where the predictability
 of the signal is used to further compress it. These functions are
 not yet implemented.
 
+@node Arithmetic Coding, Dynamic Range Compression, PCM Coding, Source Coding
+@section Arithmetic Coding
+
+The arithmetic coding functions @dfn{arithenco} and @dfn{arithdeco} are
+not yet implemented.
+
+@node Dynamic Range Compression, , Arithmetic Coding, Source Coding
+@section Dynamic Range Compression
+
 The final source coding function is @dfn{compand} which is used to
 compress and expand the dynamic range of a signal. For instance 
 consider a logarithm quantized by a linear partitioning. Such a
--- a/main/comm/eyediagram.m	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/eyediagram.m	Tue Apr 01 19:37:15 2003 +0000
@@ -15,11 +15,11 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 ## -*- texinfo -*-
-## @deftypefn {Function File} eyediagram (@var{x},@var{n})
-## @deftypefnx {Function File} eyediagram (@var{x},@var{n},@var{per})
-## @deftypefnx {Function File} eyediagram (@var{x},@var{n},@var{per},@var{off})
-## @deftypefnx {Function File} eyediagram (@var{x},@var{n},@var{per},@var{off},@var{str})
-## @deftypefnx {Function File} eyediagram (@var{x},@var{n},@var{per},@var{off},@var{str},@var{h})
+## @deftypefn {Function File} {} eyediagram (@var{x},@var{n})
+## @deftypefnx {Function File} {} eyediagram (@var{x},@var{n},@var{per})
+## @deftypefnx {Function File} {} eyediagram (@var{x},@var{n},@var{per},@var{off})
+## @deftypefnx {Function File} {} eyediagram (@var{x},@var{n},@var{per},@var{off},@var{str})
+## @deftypefnx {Function File} {} eyediagram (@var{x},@var{n},@var{per},@var{off},@var{str},@var{h})
 ## @deftypefnx {Function File} {@var{h} =} eyediagram (@var{...})
 ##
 ## Plot the eye-diagram of a signal. The signal @var{x} can be either in one
Binary file main/comm/eyediagram.png has changed
--- a/main/comm/galois-def.h	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/galois-def.h	Tue Apr 01 19:37:15 2003 +0000
@@ -79,12 +79,12 @@
     for (int i=0; i<nr; i++) \
       for (int j=0; j<nc; j++) \
         { \
-	  if ((M1.elem(i,j) < 0) || (M1. elem(i,j) > NN)) \
+	  if ((M1(i,j) < 0) || (M1(i,j) > NN)) \
 	    { \
 	      gripe_nonconformant_galois (OP, M1.m()); \
 	      return RET (); \
 	    } \
-	  if (((double)M1.elem(i,j) - (double)((int)M1.elem(i,j))) != 0.) \
+	  if (((double)M1(i,j) - (double)((int)M1(i,j))) != 0.) \
 	    { \
 	       gripe_nonconformant_galois (OP, M1.m()); \
 	       return RET (); \
@@ -100,7 +100,7 @@
     for (int i=0; i<nr; i++) \
       for (int j=0; j<nc; j++) \
         { \
-	  if (M.elem(i,j) == 0) \
+	  if (M(i,j) == 0) \
 	    { \
 	      gripe_divzero_galois(OP); \
 	      return RET (); \
@@ -183,6 +183,7 @@
 	      } \
 	    else \
 	      { \
+                int indxm1 = r.index_of((int)m1(0,0)); \
 		for (int i=0; i<m2_nr; i++) \
 		  for (int j=0; j<m2_nc; j++) \
 		    { \
@@ -190,7 +191,7 @@
 			r(i,j) = 0; \
 		      else \
 			{ \
-		          r(i,j) = r.index_of((int)m1(0,0)) OP r.index_of((int)m2(i,j)) + NN; \
+		          r(i,j) = indxm1 OP r.index_of((int)m2(i,j)) + NN; \
 		          MODN(r(i,j), r.m(), r.n()); \
 		          r(i,j) = r.alpha_to(r(i,j)); \
 			} \
@@ -208,6 +209,7 @@
 	      } \
 	    else \
 	      { \
+                int indxm2 = r.index_of((int)m2(0,0)); \
 		for (int i=0; i<m1_nr; i++) \
 		  for (int j=0; j<m1_nc; j++) \
 		    { \
@@ -215,7 +217,7 @@
 			r(i,j) = 0; \
 		      else \
 			{ \
-			  r(i,j) = r.index_of((int)m1(i,j)) OP r.index_of((int)m2(0,0)) + NN; \
+			  r(i,j) = r.index_of((int)m1(i,j)) OP  indxm2 + NN; \
 			  MODN(r(i,j), r.m(), r.n()); \
 			  r(i,j) = r.alpha_to(r(i,j)); \
 			} \
@@ -276,7 +278,7 @@
  \
 	    for (int j = 0; j < m1_nc; j++) \
 	      for (int i = 0; i < m1_nr; i++) \
-		r.elem(i, j) = C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j)); \
+		r(i, j) = C1 (m1(i, j)) OP C2 (m2(i, j)); \
 	  } \
       } \
     else \
@@ -288,14 +290,14 @@
 	    r.resize(m2_nr,m2_nc); \
 	    for (int i=0; i<m2_nr; i++) \
 	      for (int j=0; j<m2_nc; j++) \
-		r.elem(i, j) = C1 (m1.elem(0, 0)) OP C2 (m2.elem(i, j)); \
+		r(i, j) = C1 (m1(0, 0)) OP C2 (m2(i, j)); \
 	  } \
 	else if ((m2_nr == 1 && m2_nc == 1) && (m1_nr > 0 && m1_nc > 0)) \
 	  { \
 	    r.resize(m1_nr,m1_nc); \
 	    for (int i=0; i<m1_nr; i++) \
 	      for (int j=0; j<m1_nc; j++) \
-		r.elem(i, j) = C1 (m1.elem(i, j)) OP C2 (m2.elem(0, 0)); \
+		r(i, j) = C1 (m1(i, j)) OP C2 (m2(0, 0)); \
 	  } \
 	else \
 	  gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
@@ -335,8 +337,8 @@
 	    for (int j = 0; j < m1_nc; j++) \
 	      for (int i = 0; i < m1_nr; i++) \
                 { \
-		  r.elem(i, j) = (m1.elem(i, j) != ZERO) \
-                                OP (m2.elem(i, j) != ZERO); \
+		  r(i, j) = (m1(i, j) != ZERO) \
+                                OP (m2(i, j) != ZERO); \
                 } \
 	  } \
       } \
@@ -347,16 +349,16 @@
 	    r.resize(m2_nr,m2_nc); \
 	    for (int i=0; i<m2_nr; i++) \
 	      for (int j=0; j<m2_nc; j++) \
-		r.elem(i, j) = (m1.elem(0, 0) != ZERO) \
-                                OP (m2.elem(i, j) != ZERO); \
+		r(i, j) = (m1(0, 0) != ZERO) \
+                                OP (m2(i, j) != ZERO); \
 	  } \
 	else if ((m2_nr == 1 && m2_nc == 1) && (m1_nr > 0 && m1_nc > 0)) \
 	  { \
 	    r.resize(m1_nr,m1_nc); \
 	    for (int i=0; i<m1_nr; i++) \
 	      for (int j=0; j<m1_nc; j++) \
-		r.elem(i, j) = (m1.elem(i, j) != ZERO) \
-                                OP (m2.elem(0, 0) != ZERO); \
+		r(i, j) = (m1(i, j) != ZERO) \
+                                OP (m2(0, 0) != ZERO); \
 	  } \
 	else if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \
 	  gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
@@ -382,7 +384,7 @@
 	  RET.resize (nr, 1); \
 	  for (int i = 0; i < nr; i++) \
 	    { \
-	      RET.elem (i, 0) = INIT_VAL; \
+	      RET (i, 0) = INIT_VAL; \
 	      for (int j = 0; j < nc; j++) \
 		{ \
 		  ROW_EXPR; \
@@ -394,7 +396,7 @@
 	  RET.resize (1, nc); \
 	  for (int j = 0; j < nc; j++) \
 	    { \
-	      RET.elem (0, j) = INIT_VAL; \
+	      RET (0, j) = INIT_VAL; \
 	      for (int i = 0; i < nr; i++) \
 		{ \
 		  COL_EXPR; \
--- a/main/comm/galois.cc	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/galois.cc	Tue Apr 01 19:37:15 2003 +0000
@@ -50,7 +50,7 @@
 	gripe_integer_galois();
 	return;
       }
-      elem(i,j) = (int)a(i,j);
+      xelem(i,j) = (int)a(i,j);
     }
   }
 
@@ -71,7 +71,7 @@
 	gripe_integer_galois();
 	return;
       }
-      elem(i,j) = (int)a(i,j);
+      xelem(i,j) = (int)a(i,j);
     }
   }
 
@@ -89,7 +89,7 @@
 
   for (int i=0; i<rows(); i++)
     for (int j=0; j<columns(); j++)
-      elem(i,j) = val;
+      xelem(i,j) = val;
 
   field = stored_galois_fields.create_galois_field(_m, _primpoly);
 }
@@ -110,7 +110,7 @@
 
   for (int i=0; i<rows(); i++)
     for (int j=0; j<columns(); j++)
-      elem(i,j) = (int)val;
+      xelem(i,j) = (int)val;
 
   field = stored_galois_fields.create_galois_field(_m, _primpoly);
 }
@@ -184,8 +184,9 @@
       return *this;
     }
 
-  for (int i = 0; i < a.length (); i++)
-    elem (i, i) ^= a.elem (i, i);
+  for (int i=0; i<rows(); i++)
+    for (int j=0; j<columns(); j++)
+      xelem(i,j) ^= a (i, j);
 
   return *this;
 }
@@ -215,8 +216,9 @@
       return *this;
     }
 
-  for (int i = 0; i < a.length (); i++)
-    elem (i, i) ^= a.elem (i, i);
+  for (int i=0; i<rows(); i++)
+    for (int j=0; j<columns(); j++)
+      xelem(i,j) ^= a (i, j);
 
   return *this;
 }
@@ -260,17 +262,17 @@
       if (k > 0)
 	{
 	  for (int i = 0; i < ndiag; i++)
-	    retval.elem (i,0) = elem (i, i+k);
+	    retval (i,0) = xelem (i, i+k);
 	}
       else if ( k < 0)
 	{
 	  for (int i = 0; i < ndiag; i++)
-	    retval.elem (i,0) = elem (i-k, i);
+	    retval (i,0) = xelem (i-k, i);
 	}
       else
 	{
 	  for (int i = 0; i < ndiag; i++)
-	    retval.elem (i,0) = elem (i, i);
+	    retval (i,0) = xelem (i, i);
 	}
     }
   else 
@@ -291,7 +293,7 @@
 
   for (int j = 0; j < nc; j++)
     for (int i = 0; i < nr; i++)
-      b.elem (i, j) = ! elem (i, j);
+      b (i, j) = ! xelem (i, j);
 
   return b;
 }
@@ -304,7 +306,7 @@
   a.resize(d2,d1);
   for (int j = 0; j < d2; j++)
     for (int i = 0; i < d1; i++)
-      a.xelem (j, i) = xelem (i, j);
+      a (j, i) = xelem (i, j);
   
   return a;
 }
@@ -320,9 +322,9 @@
 
 galois elem_pow (const galois& a, const galois& b)
 {
-  galois result(a);
   int a_nr = a.rows ();
   int a_nc = a.cols ();
+  galois result(a_nr, a_nc, 0, a.m(), a.primpoly());
 
   int b_nr = b.rows ();
   int b_nc = b.cols ();
@@ -339,28 +341,24 @@
 
   if (a_nr == 1 && a_nc == 1)
     {
-      result.resize(b_nr,b_nc);
+      result.resize(b_nr,b_nc,0);
+      int tmp = a.index_of(a(0,0));
       for (int j = 0; j < b_nc; j++)
 	for (int i = 0; i < b_nr; i++)
-	  if (b.elem(i,j) == 0)
+	  if (b(i,j) == 0)
 	    result (i,j) = 1;
-	  else if (a.elem(0,0) == 0)
-	    result (i,j) = 0;
-	  else
-	    result (i,j) = a.alpha_to(modn(a.index_of(a.elem(0,0)) * 
-					b.elem(i,j), a.m(),a.n()));
+	  else if (a(0,0) != 0)
+	    result (i,j) = a.alpha_to(modn(tmp * b(i,j), a.m(),a.n()));
     }
   else if (b_nr == 1 && b_nc == 1)
     {
       for (int j = 0; j < a_nc; j++)
 	for (int i = 0; i < a_nr; i++)
-	  if (b.elem(0,0) == 0)
+	  if (b(0,0) == 0)
 	    result (i,j) = 1;
-	  else if (a.elem(i,j) == 0)
-	    result (i,j) = 0;
-	  else
-	    result (i,j) = a.alpha_to(modn(a.index_of(a.elem(i,j)) * 
-					 b.elem(0,0),a.m(),a.n()));
+	  else if (a(i,j) != 0)
+	    result (i,j) = a.alpha_to(modn(a.index_of(a(i,j)) * 
+					 b(0,0),a.m(),a.n()));
     }
   else 
     {
@@ -372,13 +370,11 @@
 
       for (int j = 0; j < a_nc; j++)
 	for (int i = 0; i < a_nr; i++)
-	  if (b.elem(i,j) == 0)
+	  if (b(i,j) == 0)
 	    result (i,j) = 1;
-	  else if (a.elem(i,j) == 0)
-	    result (i,j) = 0;
-	  else
-	    result (i,j) = a.alpha_to(modn(a.index_of(a.elem(i,j)) * 
-					 b.elem(i,j),a.m(),a.n()));
+	  else if (a(i,j) != 0)
+	    result (i,j) = a.alpha_to(modn(a.index_of(a(i,j)) * 
+					 b(i,j),a.m(),a.n()));
     }
 
   return result;
@@ -386,15 +382,15 @@
 
 galois elem_pow (const galois& a, const Matrix& b)
 {
-  galois result(a);
   int a_nr = a.rows ();
   int a_nc = a.cols ();
+  galois result(a_nr, a_nc, 0, a.m(), a.primpoly());
 
   int b_nr = b.rows ();
   int b_nc = b.cols ();
 
   if (b_nr == 1 && b_nc == 1)
-    return elem_pow(a, b.elem(0,0));
+    return elem_pow(a, b(0,0));
   
   if (a_nr != b_nr || a_nc != b_nc)
     {
@@ -405,15 +401,13 @@
   for (int j = 0; j < a_nc; j++)
     for (int i = 0; i < a_nr; i++)
       {
-	int tmp = (int)b.elem(i,j);
+	int tmp = (int)b(i,j);
 	while (tmp < 0)
 	  tmp += a.n();
 	if (tmp == 0)
 	  result (i,j) = 1;
-	else if (a.elem(i,j) == 0)
-	  result (i,j) = 0;
-	else
-	  result (i,j) = a.alpha_to(modn(a.index_of(a.elem(i,j)) * tmp,
+	else  if (a(i,j) != 0)
+	  result (i,j) = a.alpha_to(modn(a.index_of(a(i,j)) * tmp,
 					a.m(),a.n()));
       }
   return result;
@@ -421,9 +415,9 @@
 
 galois elem_pow (const galois& a, double b)
 {
-  galois result(a);
   int a_nr = a.rows ();
   int a_nc = a.cols ();
+  galois result(a_nr, a_nc, 0, a.m(), a.primpoly());
   int bi = (int) b;
 
   if ((double)bi != b) {
@@ -439,10 +433,8 @@
       {
 	if (bi == 0)
 	  result (i,j) = 1;
-	else if (a.elem(i,j) == 0)
-	  result (i,j) = 0;
-	else
-	  result (i,j) = a.alpha_to(modn(a.index_of(a.elem(i,j)) * 
+	else  if (a(i,j) != 0)
+	  result (i,j) = a.alpha_to(modn(a.index_of(a(i,j)) * 
 				bi,a.m(),a.n()));
       }
   return result;
@@ -450,9 +442,9 @@
 
 galois elem_pow (const galois &a, int b)
 {
-  galois result(a);
   int a_nr = a.rows ();
   int a_nc = a.cols ();
+  galois result(a_nr, a_nc, 0, a.m(), a.primpoly());
 
   while (b < 0)
     b += a.n();
@@ -462,10 +454,8 @@
       {
 	if (b == 0)
 	  result (i,j) = 1;
-	else if (a.elem(i,j) == 0)
-	  result (i,j) = 0;
-	else
-	  result (i,j) = a.alpha_to(modn(a.index_of(a.elem(i,j)) * b,
+	else if (a(i,j) != 0)
+	  result (i,j) = a.alpha_to(modn(a.index_of(a(i,j)) * b,
 				a.m(),a.n()));
       }
   return result;
@@ -501,7 +491,7 @@
     gripe_square_galois();
     return galois ();
   } else
-    return pow (a, b.elem(0,0));
+    return pow (a, b(0,0));
 }
 
 galois pow (const galois& a, int b)
@@ -521,7 +511,7 @@
     {
       retval = galois(nr, nc, 0, a.m(), a.primpoly());
       for (int i =0; i<nr; i++)
-	retval.elem(i,i) = 1;
+	retval(i,i) = 1;
     } 
   else
     {
@@ -600,17 +590,23 @@
       galois retval(a_nr, b_nc, 0, a.m(), a.primpoly());
       if (a_nr != 0 && a_nc != 0 && b_nc != 0)
 	{
-	  for (int i=0; i<b_nc; i++)
-	    for (int j=0; j<b_nr; j++)
-	      if (b.elem(j,i) != 0) {
-		int temp = b.elem(j, i);
+	  // This is not optimum for referencing b, but can use vector
+	  // to represent index(a(k,j)). Seems to be the fastest.
+	  galois c(a_nr, 1, 0, a.m(), a.primpoly());
+	  for (int j=0; j<b_nr; j++) {
+	    for (int k=0; k<a_nr; k++) 
+	      c(k,0) = a.index_of(a(k,j));
+
+	    for (int i=0; i<b_nc; i++)
+	      if (b(j,i) != 0) {
+		int tmp = a.index_of(b(j,i));
 		for (int k=0; k<a_nr; k++) {
-		  if (a.elem(k,j) != 0)
+		  if (a(k,j) != 0)
 		    retval(k,i) = retval(k,i) ^ a.alpha_to(
-			  modn(a.index_of(temp) + 
-			  a.index_of(a.elem(k,j)),a.m(),a.n()));
+			 modn(tmp + c(k,0),a.m(),a.n()));
 		}
 	      }
+	  }
 	}
       return retval;
     }
@@ -640,17 +636,17 @@
   galois retval (0, 0, 0, m(), primpoly());
 
 #define ROW_EXPR \
-  if ((retval.elem (i, 0) == 0) || (elem(i,j) == 0)) \
-    retval.elem (i, 0) = 0; \
+  if ((retval (i, 0) == 0) || (elem(i,j) == 0)) \
+    retval (i, 0) = 0; \
   else \
-    retval.elem (i, 0) = alpha_to(modn(index_of(retval.elem(i,0)) + \
+    retval (i, 0) = alpha_to(modn(index_of(retval(i,0)) + \
 				      index_of(elem(i,j)),m(),n()));
 
 #define COL_EXPR \
-  if ((retval.elem (0, j) == 0) || (elem(i,j) == 0)) \
-    retval.elem (0, j) = 0; \
+  if ((retval (0, j) == 0) || (elem(i,j) == 0)) \
+    retval (0, j) = 0; \
   else \
-    retval.elem (0, j) = alpha_to(modn(index_of(retval.elem(0,j)) + \
+    retval (0, j) = alpha_to(modn(index_of(retval(0,j)) + \
 				      index_of(elem(i,j)),m(),n()));
 
   GALOIS_REDUCTION_OP(retval, ROW_EXPR, COL_EXPR, 1, 1);
@@ -672,10 +668,10 @@
 
 
 #define ROW_EXPR \
-  retval.elem (i, 0) ^=  elem(i,j);
+  retval (i, 0) ^=  elem(i,j);
 
 #define COL_EXPR \
-  retval.elem (0, j) ^= elem(i,j);
+  retval (0, j) ^= elem(i,j);
 
   GALOIS_REDUCTION_OP (retval, ROW_EXPR, COL_EXPR, 0, 0);
   return retval;
@@ -696,11 +692,11 @@
 
 #define ROW_EXPR \
   if (elem(i,j) != 0) \
-    retval.elem (i, 0) ^= alpha_to(modn(2*index_of(elem(i,j)),m(),n()));
+    retval (i, 0) ^= alpha_to(modn(2*index_of(elem(i,j)),m(),n()));
 
 #define COL_EXPR \
   if (elem(i,j) != 0) \
-    retval.elem (0, j) ^= alpha_to(modn(2*index_of(elem(i,j)),m(),n()));
+    retval (0, j) ^= alpha_to(modn(2*index_of(elem(i,j)),m(),n()));
 
   GALOIS_REDUCTION_OP (retval, ROW_EXPR, COL_EXPR, 0, 0);
   return retval;
@@ -710,6 +706,25 @@
 }
 
 galois
+galois::sqrt (void) const
+{
+  galois retval (*this);
+  int nr = rows ();
+  int nc = cols ();
+
+  for (int j=0; j<nc; j++) {
+    for (int i=0; i<nr; i++)
+      if (retval.index_of(retval(i,j)) & 1)
+	retval(i,j) = retval.alpha_to((retval.index_of(retval(i,j))
+					    + retval.n()) / 2);
+      else
+	retval(i,j) = retval.alpha_to(retval.index_of(retval(i,j))
+					   / 2);
+    }
+  return retval;
+}
+
+galois
 galois::log (void) const
 {
   bool warned = false; 
@@ -722,9 +737,9 @@
   int nr = rows ();
   int nc = cols ();
 
-  for (int i=0; i<nr; i++)
-    for (int j=0; j<nc; j++) {
-      if (retval.elem(i,j) == 0) { 
+  for (int j=0; j<nc; j++)
+    for (int i=0; i<nr; i++) {
+      if (retval(i,j) == 0) { 
 	if (!warned) {
 	  warning("log of zero undefined in Galois field");
 	  warned = true;
@@ -732,9 +747,9 @@
 	// How do I flag a NaN without either
 	// 1) Having to check everytime that the data is valid
 	// 2) Causing overflow in alpha_to or index_of!!
-	retval.elem(i,j) = retval.index_of(retval.elem(i,j));
+	retval(i,j) = retval.index_of(retval(i,j));
       } else
-	retval.elem(i,j) = retval.index_of(retval.elem(i,j));
+	retval(i,j) = retval.index_of(retval(i,j));
     }
   return retval;
 }
@@ -752,9 +767,9 @@
   int nr = rows ();
   int nc = cols ();
 
-  for (int i=0; i<nr; i++)
-    for (int j=0; j<nc; j++) {
-      if (retval.elem(i,j) ==  n()) {
+  for (int j=0; j<nc; j++)
+    for (int i=0; i<nr; i++) {
+      if (retval(i,j) ==  n()) {
 	if (!warned) {
 	  warning("warning: exp of 2^m-1 undefined in Galois field");
 	  warned = true;
@@ -762,9 +777,9 @@
 	// How do I flag a NaN without either
 	// 1) Having to check everytime that the data is valid
 	// 2) Causing overflow in alpha_to or index_of!!
-	retval.elem(i,j) = retval.alpha_to(retval.elem(i,j));
+	retval(i,j) = retval.alpha_to(retval(i,j));
       } else
-	retval.elem(i,j) = retval.alpha_to(retval.elem(i,j));
+	retval(i,j) = retval.alpha_to(retval(i,j));
     }
   return retval;
 }
@@ -787,48 +802,47 @@
   for (int j = 0; j < mn; j++) {
     int jp = j;
 
-
     // Find the pivot and test for singularity
     if (ptype == LU::ROW) { 
       for (int i = j+1; i < a_nr; i++)
-	if (a_fact.elem(i,j) > a_fact.elem(jp,j))
+	if (a_fact(i,j) > a_fact(jp,j))
 	  jp = i;
     } else {
       for (int i = j+1; i < a_nc; i++)
-	if (a_fact.elem(j,i) > a_fact.elem(j,jp))
+	if (a_fact(j,i) > a_fact(j,jp))
 	  jp = i;
     }
 
-    ipvt.elem(j) = jp;
+    ipvt(j) = jp;
 
-    if (a_fact.elem(jp,j) != 0) {
+    if (a_fact(jp,j) != 0) {
       if (ptype == LU::ROW) { 
 	// Apply the interchange to columns 1:NC.
 	if (jp != j)
 	  for (int i = 0; i < a_nc; i++) {
-	    int tmp = a_fact.elem(j,i);
-	    a_fact.elem(j,i) = a_fact.elem(jp,i);
-	    a_fact.elem(jp,i) = tmp;
+	    int tmp = a_fact(j,i);
+	    a_fact(j,i) = a_fact(jp,i);
+	    a_fact(jp,i) = tmp;
 	  }
       } else {
 	// Apply the interchange to rows 1:NR.
 	if (jp != j)
 	  for (int i = 0; i < a_nr; i++) {
-	    int tmp = a_fact.elem(i,j);
-	    a_fact.elem(i,j) = a_fact.elem(i,jp);
-	    a_fact.elem(i,jp) = tmp;
+	    int tmp = a_fact(i,j);
+	    a_fact(i,j) = a_fact(i,jp);
+	    a_fact(i,jp) = tmp;
 	  }
       }
 
       // Compute elements J+1:M of J-th column.
       if ( j < a_nr-1) {
-	int idxj = a_fact.index_of(a_fact.elem(j,j)); 
+	int idxj = a_fact.index_of(a_fact(j,j)); 
 	for (int i = j+1; i < a_nr; i++) {
-	  if (a_fact.elem(i,j) == 0)
-	    a_fact.elem(i,j) = 0;
+	  if (a_fact(i,j) == 0)
+	    a_fact(i,j) = 0;
 	  else
-	    a_fact.elem(i,j) = a_fact.alpha_to(modn(a_fact.index_of(
-		a_fact.elem(i,j)) - idxj + a_fact.n(), a_fact.m(), 
+	    a_fact(i,j) = a_fact.alpha_to(modn(a_fact.index_of(
+		a_fact(i,j)) - idxj + a_fact.n(), a_fact.m(), 
 		a_fact.n()));
 	}
       }
@@ -839,12 +853,12 @@
     if (j < mn-1) {
       // Update trailing submatrix.
       for (int i=j+1; i < a_nr; i++) {
-	if (a_fact.elem(i,j) != 0) {
-	  int idxi = a_fact.index_of(a_fact.elem(i,j)); 
+	if (a_fact(i,j) != 0) {
+	  int idxi = a_fact.index_of(a_fact(i,j)); 
 	  for (int k=j+1; k < a_nc; k++) {
-	    if (a_fact.elem(j,k) != 0)
-	      a_fact.elem(i,k) ^= a_fact.alpha_to(modn(a_fact.index_of(
-			a_fact.elem(j,k)) + idxi, a_fact.m(), a_fact.n()));
+	    if (a_fact(j,k) != 0)
+	      a_fact(i,k) ^= a_fact.alpha_to(modn(a_fact.index_of(
+			a_fact(j,k)) + idxi, a_fact.m(), a_fact.n()));
 	  }
 	}
       }
@@ -861,12 +875,12 @@
 
   galois l (a_nr, mn, 0, a_fact.m(), a_fact.primpoly());
 
-  for (int i = 0; i < a_nr; i++)
-    {
-      l.xelem (i, i) = 1;
-      for (int j = 0; j < (i > a_nc ? a_nc : i); j++)
-	l.xelem (i, j) = a_fact.xelem (i, j);
-    }
+  for (int i = 0; i < mn; i++)
+    l (i, i) = 1;
+
+  for (int j = 0; j < mn; j++)
+    for (int i = j+1; i < a_nr; i++)
+      l (i, j) = a_fact (i, j);
 
   return l;
 }
@@ -880,12 +894,9 @@
 
   galois u (mn, a_nc, 0, a_fact.m(), a_fact.primpoly());
 
-  for (int i = 0; i < mn; i++)
-    {
-      for (int j = i; j < a_nc; j++)
-	u.xelem (i, j) = a_fact.xelem (i, j);
-    }
-
+  for (int j = 0; j < a_nc; j++)
+    for (int i = 0; i < (j+1 > mn ? mn : j+1); i++)
+      u (i, j) = a_fact (i, j);
   return u;
 }
 
@@ -899,24 +910,24 @@
   Array<int> pvt (n);
   
   for (int i = 0; i < n; i++)
-    pvt.xelem (i) = i;
+    pvt (i) = i;
 
   for (int i = 0; i < ipvt.length(); i++)
     {
-      int k = ipvt.xelem (i);
+      int k = ipvt (i);
 
       if (k != i)
 	{
-	  int tmp = pvt.xelem (k);
-	  pvt.xelem (k) = pvt.xelem (i);
-	  pvt.xelem (i) = tmp;
+	  int tmp = pvt (k);
+	  pvt (k) = pvt (i);
+	  pvt (i) = tmp;
 	}
     }
 
   Matrix p(n, n, 0.0);
 
   for (int i = 0; i < n; i++)
-    p.xelem (i, pvt.xelem (i)) = 1.0;
+    p (i, pvt (i)) = 1.0;
 
   return p;
 }
@@ -956,7 +967,7 @@
     // Solve with identity matrix to find the inverse. 
     galois btmp(nr, nr, 0, m(), primpoly());
     for (int i=0; i < nr; i++)
-      btmp.elem(i,i) = 1;
+      btmp(i,i) = 1;
 
     galois retval = solve(btmp, info, 0);
 
@@ -985,7 +996,7 @@
 
   if (nr == 0 || nc == 0) {
     info = 0;
-    retval.elem(0,0) = 1;
+    retval(0,0) = 1;
   } else {
     LU fact (*this);
 
@@ -993,14 +1004,14 @@
       galois A (fact.A());
       info = 0;
 
-      retval.elem(0,0) = A.elem(0,0);
+      retval(0,0) = A(0,0);
       for (int i=1; i<nr; i++) {
-	if ((retval.elem (0, 0) == 0) || (A.elem(i,i) == 0)) {
-	  retval.elem (0,0) = 0;
+	if ((retval (0, 0) == 0) || (A(i,i) == 0)) {
+	  retval (0,0) = 0;
 	  error("What the hell are we doing here!!!");
 	} else 
-	  retval.elem (0,0) = alpha_to(modn(index_of(retval.elem(0,0)) + \
-					     index_of(A.elem(i,i)),m(),n()));
+	  retval (0,0) = alpha_to(modn(index_of(retval(0,0)) + \
+					     index_of(A(i,i)),m(),n()));
       }
     }    
   }
@@ -1039,6 +1050,7 @@
   int nc = cols ();
   int b_nr = b.rows ();
   int b_nc = b.cols ();
+  galois c(nr,1,0,m(),primpoly());
 
   //  if (nr == 0 || nc == 0 || nr != nc || nr != b_nr) {
   if (nr == 0 || nc == 0 || nr != b_nr) {
@@ -1066,37 +1078,45 @@
 	retval.resize(b_nr+nc-nr,b_nc,0);
 
       //Solve L*X = B, overwriting B with X.
-      for (int j=0; j<b_nc; j++)
-	for (int k=0; k<(nc < nr ? nc : nr); k++)
-	  if (retval.elem(k,j) != 0) {
-	    int idx = index_of(retval.elem(k,j));
+      int mn = (nc < nr ? nc : nr);
+      for (int k=0; k<mn; k++) {
+	for (int i=k+1; i<nr; i++)
+	  c(i,0) = index_of(A(i,k));
+
+	for (int j=0; j<b_nc; j++)
+	  if (retval(k,j) != 0) {
+	    int idx = index_of(retval(k,j));
 	    for (int i=k+1; i<nr; i++)
-	      if (A.elem(i,k) != 0)
-		retval.elem(i,j) ^= alpha_to(modn(index_of(A.elem(i,k)) + idx, 
-					      m(), n()));
+	      if (A(i,k) != 0)
+		retval(i,j) ^= alpha_to(modn(c(i,0) + idx, m(), n()));
 	  }
+      }
 
       // Solve U*X = B, overwriting B with X.
-      for (int j=0; j<b_nc; j++)
-	for (int k=(nc < nr ? nc-1 : nr-1); k>=0; k--)
-	  if (retval.elem(k,j) != 0) {
-	    retval.elem(k,j) = alpha_to(modn(index_of(retval.elem(k,j)) -
-				     index_of(A.elem(k,k)) + n(), m(), n()));
-	    int idx = index_of(retval.elem(k,j));
-	    for (int i=0; i<(k < nr ? k : nr); i++)
-	      if (A.elem(i,k) != 0)
-		retval.elem(i,j) ^= alpha_to(modn(index_of(A.elem(i,k)) + idx, 
-					      m(), n()));
+      for (int k=(nc < nr ? nc-1 : nr-1); k>=0; k--) {
+	int mn = k+1 < nr ? k+1 : nr;
+	for (int i=0; i<mn; i++)
+	  c(i,0) = index_of(A(i,k));
+	mn = k < nr ? k : nr;
+	for (int j=0; j<b_nc; j++)
+	  if (retval(k,j) != 0) {
+	    retval(k,j) = alpha_to(modn(index_of(retval(k,j)) - 
+					c(k,0) + n(), m(), n()));
+	    int idx = index_of(retval(k,j));
+	    for (int i=0; i<mn; i++)
+	      if (A(i,k) != 0)
+		retval(i,j) ^= alpha_to(modn(c(i,0) + idx, m(), n()));
 	  }
+      }
 
       // Apply row interchanges to the right hand sides.
       //for (int j=0; j<IP.length(); j++) {
       for (int j=IP.length()-1; j>=0; j--) {
 	int piv = IP(j);
 	for (int i=0; i<b_nc; i++) {
-	  int tmp = retval.elem(j,i);
-	  retval.elem(j,i) = retval.elem(piv,i);
-	  retval.elem(piv,i) = tmp;
+	  int tmp = retval(j,i);
+	  retval(j,i) = retval(piv,i);
+	  retval(piv,i) = tmp;
 	}
       }
     }
@@ -1120,35 +1140,42 @@
       for (int j=0; j<IP.length(); j++) {
 	int piv = IP(j);
 	for (int i=0; i<b_nc; i++) {
-	  int tmp = retval.elem(j,i);
-	  retval.elem(j,i) = retval.elem(piv,i);
-	  retval.elem(piv,i) = tmp;
+	  int tmp = retval(j,i);
+	  retval(j,i) = retval(piv,i);
+	  retval(piv,i) = tmp;
 	}
       }
 
       //Solve L*X = B, overwriting B with X.
-      for (int j=0; j<b_nc; j++)
-	for (int k=0; k<(nc < nr ? nc : nr); k++)
-	  if (retval.elem(k,j) != 0) {
-	    int idx = index_of(retval.elem(k,j));
+      int mn = (nc < nr ? nc : nr);
+      for (int k=0; k<mn; k++) {
+	for (int i=k+1; i<nr; i++)
+	  c(i,0) = index_of(A(i,k));
+	for (int j=0; j<b_nc; j++)
+	  if (retval(k,j) != 0) {
+	    int idx = index_of(retval(k,j));
 	    for (int i=k+1; i<nr; i++)
-	      if (A.elem(i,k) != 0)
-		retval.elem(i,j) ^= alpha_to(modn(index_of(A.elem(i,k)) + idx, 
-					      m(), n()));
+	      if (A(i,k) != 0)
+		retval(i,j) ^= alpha_to(modn(c(i,0) + idx, m(), n()));
 	  }
+      }
 
       // Solve U*X = B, overwriting B with X.
-      for (int j=0; j<b_nc; j++)
-	for (int k=(nc < nr ? nc-1 : nr-1); k>=0; k--)
-	  if (retval.elem(k,j) != 0) {
-	    retval.elem(k,j) = alpha_to(modn(index_of(retval.elem(k,j)) -
-				     index_of(A.elem(k,k)) + n(), m(), n()));
-	    int idx = index_of(retval.elem(k,j));
-	    for (int i=0; i<(k < nr ? k : nr); i++)
-	      if (A.elem(i,k) != 0)
-		retval.elem(i,j) ^= alpha_to(modn(index_of(A.elem(i,k)) + idx, 
-					      m(), n()));
+      for (int k=(nc < nr ? nc-1 : nr-1); k>=0; k--) {
+	int mn = k+1 < nr ? k+1 : nr;
+	for (int i=0; i<mn; i++)
+	  c(i,0) = index_of(A(i,k));
+	mn = k < nr ? k : nr;
+	for (int j=0; j<b_nc; j++)
+	  if (retval(k,j) != 0) {
+	    retval(k,j) = alpha_to(modn(index_of(retval(k,j)) -
+				     c(k,0) + n(), m(), n()));
+	    int idx = index_of(retval(k,j));
+	    for (int i=0; i<mn; i++)
+	      if (A(i,k) != 0)
+		retval(i,j) ^= alpha_to(modn(c(i,0) + idx, m(), n()));
 	  }
+      }
 
       // Resize the number of solution rows if needed
       if (nc < nr)
--- a/main/comm/galois.h	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/galois.h	Tue Apr 01 19:37:15 2003 +0000
@@ -99,6 +99,7 @@
   galois prod (int dim) const;
   galois sum (int dim) const;
   galois sumsq (int dim) const;
+  galois sqrt (void) const;
   galois log (void) const;
   galois exp (void) const;
   galois inverse (void) const;
--- a/main/comm/gf.cc	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/gf.cc	Tue Apr 01 19:37:15 2003 +0000
@@ -166,13 +166,13 @@
 	    int n = nc + k;
 	    galois r (n, n, 0, m.m(), m.primpoly());
 	    for (int i = 0; i < nc; i++)
-	      r.elem (i+roff, i+coff) = m.elem (0, i);
+	      r (i+roff, i+coff) = m (0, i);
 	    retval = new octave_galois (r);
 	  } else {
 	    int n = nr + k;
 	    galois r (n, n, 0, m.m(), m.primpoly());
 	    for (int i = 0; i < nr; i++)
-	      r.elem (i+roff, i+coff) = m.elem (i, 0);
+	      r (i+roff, i+coff) = m (i, 0);
 	    retval = new octave_galois (r);
 	  }
 	} else {
@@ -297,11 +297,11 @@
       RowVector tmp1(mr*mc);
       for (int i=0;i<nr;i++)
 	for (int j=0;j<nc;j++)
-	  tmp1(i+j*nr) = (double)a.elem(i,j);
+	  tmp1(i+j*nr) = (double)a(i,j);
       galois tmp2(mr,mc,0,a.m(),a.primpoly());
       for (int i=0;i<mr;i++)
 	for (int j=0;j<mc;j++)
-	  tmp2.elem(i,j) = (int)tmp1(i+j*mr);
+	  tmp2(i,j) = (int)tmp1(i+j*mr);
       retval = new octave_galois(tmp2);
     }
   }
@@ -389,6 +389,35 @@
   DATA_REDUCTION (sumsq);
 }
 
+// PKG_ADD: dispatch ("sqrt", "gsqrt", "galois");
+DEFUN_DLD (gsqrt, args, ,
+    "-*- texinfo -*-\n"
+"@deftypefn {Loadable Function} {} gsqrt (@var{x})\n"
+"Compute the square root of @var{x}, element by element, in a Galois Field.\n"
+"@end deftypefn\n"
+"@seealso{exp}")
+{
+  octave_value retval;
+  int nargin = args.length ();
+
+  if (!galois_type_loaded || (args(0).type_id () != 
+			      octave_galois::static_type_id ())) {
+    gripe_wrong_type_arg ("gsqrt", args(0));
+    return retval;
+  }
+
+  if (nargin != 1) {
+    print_usage("gsqrt");
+    return retval;
+  }
+
+  galois a = ((const octave_galois&) args(0).get_rep()).galois_value ();
+
+  retval = new octave_galois(a.sqrt());
+
+  return retval;
+}
+
 // PKG_ADD: dispatch ("log", "glog", "galois");
 DEFUN_DLD (glog, args, ,
     "-*- texinfo -*-\n"
@@ -419,6 +448,7 @@
   return retval;
 }
 
+
 // PKG_ADD: dispatch ("exp", "gexp", "galois");
 DEFUN_DLD (gexp, args, ,
     "-*- texinfo -*-\n"
@@ -438,7 +468,7 @@
   }
 
   if (nargin != 1) {
-    print_usage("exp");
+    print_usage("gexp");
     return retval;
   }
 
@@ -462,7 +492,7 @@
   int ab_len = (a.length() > b.length() ? a.length() : b.length());
   b.resize(ab_len, 1, 0);
   galois retval(x.length(), 1, 0, b.m(), b.primpoly());
-  int norm = a.elem(0,0);
+  int norm = a(0,0);
 
   if (norm == 0) {
     error("gfilter: the first element of a must be non-zero");
@@ -475,8 +505,8 @@
   if (norm != 1) {
     int idx_norm = b.index_of(norm);
     for (int i=0; i < b.length(); i++) {
-      if (b.elem(i,0) != 0)
-	b.elem(i,0) = b.alpha_to(modn(b.index_of(b.elem(i,0))-idx_norm+b.n(),
+      if (b(i,0) != 0)
+	b(i,0) = b.alpha_to(modn(b.index_of(b(i,0))-idx_norm+b.n(),
 		b.m(),b.n()));
     }
   }
@@ -486,74 +516,74 @@
     if (norm != 1) {
       int idx_norm = a.index_of(norm);
       for (int i=0; i < a.length(); i++)
-	if (a.elem(i,0) != 0)
-	  a.elem(i,0) = a.alpha_to(modn(a.index_of(a.elem(i,0))-idx_norm+a.n(),
+	if (a(i,0) != 0)
+	  a(i,0) = a.alpha_to(modn(a.index_of(a(i,0))-idx_norm+a.n(),
 				 a.m(),a.n()));
     }
 
     for (int i=0; i < x.length(); i++) {
-      retval.elem(i,0) = si.elem(0,0);
-      if ((b.elem(0,0) != 0) && (x.elem(i,0) != 0))
-	retval.elem(i,0) ^= b.alpha_to(modn(b.index_of(b.elem(0,0)) + 
-		b.index_of(x.elem(i,0)),b.m(),b.n()));
+      retval(i,0) = si(0,0);
+      if ((b(0,0) != 0) && (x(i,0) != 0))
+	retval(i,0) ^= b.alpha_to(modn(b.index_of(b(0,0)) + 
+		b.index_of(x(i,0)),b.m(),b.n()));
       if (si.length() > 1) {
 	for (int j = 0; j < si.length() - 1; j++) {
-	  si.elem(j,0) = si.elem(j+1,0);
-	  if ((a.elem(j+1,0) != 0) && (retval.elem(i,0) != 0))
-	    si.elem(j,0) ^= a.alpha_to(modn(a.index_of(a.elem(j+1,0)) + 
-		a.index_of(retval.elem(i,0)),a.m(),a.n()));
-	  if ((b.elem(j+1,0) != 0) && (x.elem(i,0) != 0))
-	    si.elem(j,0) ^= b.alpha_to(modn(b.index_of(b.elem(j+1,0)) + 
-		b.index_of(x.elem(i,0)),b.m(),b.n()));
+	  si(j,0) = si(j+1,0);
+	  if ((a(j+1,0) != 0) && (retval(i,0) != 0))
+	    si(j,0) ^= a.alpha_to(modn(a.index_of(a(j+1,0)) + 
+		a.index_of(retval(i,0)),a.m(),a.n()));
+	  if ((b(j+1,0) != 0) && (x(i,0) != 0))
+	    si(j,0) ^= b.alpha_to(modn(b.index_of(b(j+1,0)) + 
+		b.index_of(x(i,0)),b.m(),b.n()));
 	}
-	si.elem(si.length()-1,0) = 0;
-	if ((a.elem(si.length(),0) != 0) && (retval.elem(si.length(),0) != 0))
-	  si.elem(si.length()-1,0) ^= a.alpha_to(modn(a.index_of(
-		a.elem(si.length(),0))+a.index_of(retval.elem(i,0)),
+	si(si.length()-1,0) = 0;
+	if ((a(si.length(),0) != 0) && (retval(si.length(),0) != 0))
+	  si(si.length()-1,0) ^= a.alpha_to(modn(a.index_of(
+		a(si.length(),0))+a.index_of(retval(i,0)),
 		a.m(),a.n()));
-	if ((b.elem(si.length(),0) != 0) && (x.elem(i,0) != 0))
-	  si.elem(si.length()-1,0) ^= b.alpha_to(modn(b.index_of(
-		b.elem(si.length(),0))+ b.index_of(x.elem(i,0)),
+	if ((b(si.length(),0) != 0) && (x(i,0) != 0))
+	  si(si.length()-1,0) ^= b.alpha_to(modn(b.index_of(
+		b(si.length(),0))+ b.index_of(x(i,0)),
 		b.m(),b.n()));
       } else {
-	si.elem(0,0) = 0;
-	if ((a.elem(1,0) != 0) && (retval.elem(i,0) != 0))
-	  si.elem(0,0) ^=  a.alpha_to(modn(a.index_of(a.elem(1,0))+ 
-		a.index_of(retval.elem(i,0)),a.m(),a.n()));
-	if ((b.elem(1,0) != 0) && (x.elem(i,0) != 0))
-	  si.elem(0,0) ^= b.alpha_to(modn(b.index_of(b.elem(1,0))+
-		b.index_of(x.elem(i,0)),b.m(),b.n()));
+	si(0,0) = 0;
+	if ((a(1,0) != 0) && (retval(i,0) != 0))
+	  si(0,0) ^=  a.alpha_to(modn(a.index_of(a(1,0))+ 
+		a.index_of(retval(i,0)),a.m(),a.n()));
+	if ((b(1,0) != 0) && (x(i,0) != 0))
+	  si(0,0) ^= b.alpha_to(modn(b.index_of(b(1,0))+
+		b.index_of(x(i,0)),b.m(),b.n()));
       }
     }
   } else if (si.length() > 0) {
     for (int i = 0; i < x.length(); i++) {
-      retval.elem(i,0) = si.elem(0,0);
-      if ((b.elem(0,0) != 0) && (x.elem(i,0) != 0))
-	retval.elem(i,0) ^= b.alpha_to(modn(b.index_of(b.elem(0,0)) + 
-		b.index_of(x.elem(i,0)),b.m(),b.n()));
+      retval(i,0) = si(0,0);
+      if ((b(0,0) != 0) && (x(i,0) != 0))
+	retval(i,0) ^= b.alpha_to(modn(b.index_of(b(0,0)) + 
+		b.index_of(x(i,0)),b.m(),b.n()));
       if (si.length() > 1) {
 	for (int j = 0; j < si.length() - 1; j++) {
-	  si.elem(j,0) = si.elem(j+1,0);
-	  if ((b.elem(j+1,0) != 0) && (x.elem(i,0) != 0))
-	    si.elem(j,0) ^= b.alpha_to(modn(b.index_of(b.elem(j+1,0)) + 
-		b.index_of(x.elem(i,0)),b.m(),b.n()));
+	  si(j,0) = si(j+1,0);
+	  if ((b(j+1,0) != 0) && (x(i,0) != 0))
+	    si(j,0) ^= b.alpha_to(modn(b.index_of(b(j+1,0)) + 
+		b.index_of(x(i,0)),b.m(),b.n()));
 	}
-	si.elem(si.length()-1,0) = 0;
-	if ((b.elem(si.length(),0) != 0) && (x.elem(i,0) != 0))
-	  si.elem(si.length()-1,0) ^= b.alpha_to(modn(b.index_of(
-		b.elem(si.length(),0)) + b.index_of(x.elem(i,0)),b.m(),b.n()));
+	si(si.length()-1,0) = 0;
+	if ((b(si.length(),0) != 0) && (x(i,0) != 0))
+	  si(si.length()-1,0) ^= b.alpha_to(modn(b.index_of(
+		b(si.length(),0)) + b.index_of(x(i,0)),b.m(),b.n()));
       } else {
-	si.elem(0,0) = 0;
-	if ((b.elem(1,0) != 0) && (x.elem(i,0) != 0))
-	  si.elem(0,0) ^= b.alpha_to(modn(b.index_of(b.elem(1,0)) + 
-		b.index_of(x.elem(i,0)), b.m(), b.n()));
+	si(0,0) = 0;
+	if ((b(1,0) != 0) && (x(i,0) != 0))
+	  si(0,0) ^= b.alpha_to(modn(b.index_of(b(1,0)) + 
+		b.index_of(x(i,0)), b.m(), b.n()));
       }
     }
   } else
     for (int i=0; i<x.length(); i++)
-      if ((b.elem(0,0) != 0) && (x.elem(i,0) != 0))
-	retval.elem(i,0) = b.alpha_to(modn(b.index_of(b.elem(0,0)) + 
-		b.index_of(x.elem(i,0)), b.m(),b.n()));
+      if ((b(0,0) != 0) && (x(i,0) != 0))
+	retval(i,0) = b.alpha_to(modn(b.index_of(b(0,0)) + 
+		b.index_of(x(i,0)), b.m(),b.n()));
 
   return retval;
 }
@@ -1175,23 +1205,23 @@
     // Create polynomial of right length.
     genpoly = galois(nroots+1,1,0,m,primpoly);
 
-    genpoly.elem(nroots,0) = 1;
+    genpoly(nroots,0) = 1;
     int i,root;
     for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) {
-      genpoly.elem(nroots-i-1,0) = 1;
+      genpoly(nroots-i-1,0) = 1;
 
       // Multiply genpoly by  @**(root + x)
       for (int j = i; j > 0; j--){
 	int k = nroots - j;
-	if (genpoly.elem(k,0) != 0)
-	  genpoly.elem(k,0) = genpoly.elem(k+1,0) ^ genpoly.alpha_to(
-		modn(genpoly.index_of(genpoly.elem(k,0)) + root, m, n));
+	if (genpoly(k,0) != 0)
+	  genpoly(k,0) = genpoly(k+1,0) ^ genpoly.alpha_to(
+		modn(genpoly.index_of(genpoly(k,0)) + root, m, n));
 	else
-	  genpoly.elem(k,0) = genpoly.elem(k+1,0);
+	  genpoly(k,0) = genpoly(k+1,0);
       }
       // genpoly(nroots,0) can never be zero
-      genpoly.elem(nroots,0) = genpoly.alpha_to(modn(genpoly.index_of(
-			genpoly.elem(nroots,0)) + root, m, n));
+      genpoly(nroots,0) = genpoly.alpha_to(modn(genpoly.index_of(
+			genpoly(nroots,0)) + root, m, n));
     }
 
   } else {
@@ -1211,11 +1241,11 @@
     }
   }
 
-  int norm = genpoly.elem(0,0);
+  int norm = genpoly(0,0);
 
   // Take logarithm of generator polynomial, for faster coding
   for (int i = 0; i < nroots+1; i++)
-    genpoly.elem(i,0) = genpoly.index_of(genpoly.elem(i,0));
+    genpoly(i,0) = genpoly.index_of(genpoly(i,0));
 
   // Add space for parity block
   msg.resize(nsym,n,0);
@@ -1234,24 +1264,24 @@
     for (int l = 0; l < nsym; l++) {
       galois par(nroots,1,0,m,primpoly);
       for (int i = 0; i < k; i++) { 
-	int feedback = par.index_of(par.elem(0,0) ^ msg.elem(l,i));
+	int feedback = par.index_of(par(0,0) ^ msg(l,i));
 	if (feedback != nn) {
 	  if (norm != 1)
-	    feedback = modn(nn-genpoly.elem(0,0)+feedback, m, nn);
+	    feedback = modn(nn-genpoly(0,0)+feedback, m, nn);
 	  for (int j = 1; j < nroots; j++)
-	    par.elem(j,0) ^= par.alpha_to(modn(feedback +
-					       genpoly.elem(j,0), m, nn)); 
+	    par(j,0) ^= par.alpha_to(modn(feedback +
+					       genpoly(j,0), m, nn)); 
 	}
 	for (int j = 1; j < nroots; j++)
-	  par.elem(j-1,0) = par.elem(j,0);
+	  par(j-1,0) = par(j,0);
 	if (feedback != nn)
-	  par.elem(nroots-1,0) = par.alpha_to(modn(feedback+
-					genpoly.elem(nroots,0), m, nn));
+	  par(nroots-1,0) = par.alpha_to(modn(feedback+
+					genpoly(nroots,0), m, nn));
 	else
-	  par.elem(nroots-1,0) = 0;
+	  par(nroots-1,0) = 0;
       }
       for (int j = 0; j < nroots; j++)
-	msg.elem(l,k+j) = par.elem(j,0);
+	msg(l,k+j) = par(j,0);
     }
   } else {
     for (int l = 0; l < nsym; l++) {
@@ -1263,24 +1293,24 @@
     for (int l = 0; l < nsym; l++) {
       galois par(nroots,1,0,m,primpoly);
       for (int i = n; i > nroots; i--) { 
-	int feedback = par.index_of(par.elem(0,0) ^ msg.elem(l,i-1));
+	int feedback = par.index_of(par(0,0) ^ msg(l,i-1));
 	if (feedback != nn) {
 	  if (norm != 1)
-	    feedback = modn(nn-genpoly.elem(0,0)+feedback, m, nn);
+	    feedback = modn(nn-genpoly(0,0)+feedback, m, nn);
 	  for (int j = 1; j < nroots; j++)
-	    par.elem(j,0) ^= par.alpha_to(modn(feedback +
-					       genpoly.elem(j,0), m, nn)); 
+	    par(j,0) ^= par.alpha_to(modn(feedback +
+					       genpoly(j,0), m, nn)); 
 	}
 	for (int j = 1; j < nroots; j++)
-	  par.elem(j-1,0) = par.elem(j,0);
+	  par(j-1,0) = par(j,0);
 	if (feedback != nn)
-	  par.elem(nroots-1,0) = par.alpha_to(modn(feedback+
-					genpoly.elem(nroots,0), m, nn));
+	  par(nroots-1,0) = par.alpha_to(modn(feedback+
+					genpoly(nroots,0), m, nn));
 	else
-	  par.elem(nroots-1,0) = 0;
+	  par(nroots-1,0) = 0;
       }
       for (int j = 0; j < nroots; j++)
-	msg.elem(l,j) = par.elem(nroots-j-1,0);
+	msg(l,j) = par(nroots-j-1,0);
     }
   }
 
@@ -1323,25 +1353,25 @@
   /* form the syndromes; i.e., evaluate data(x) at roots of g(x) */
   if (msb_first) {
     for(i=0;i<nroots;i++)
-      s[i] = data.elem(drow,0);
+      s[i] = data(drow,0);
 
     for(j=1;j<n;j++)
       for(i=0;i<nroots;i++)
 	if(s[i] == 0)
-	  s[i] = data.elem(drow,j);
+	  s[i] = data(drow,j);
 	else
-	  s[i] = data.elem(drow,j) ^ data.alpha_to(modn(data.index_of(s[i]) + 
+	  s[i] = data(drow,j) ^ data.alpha_to(modn(data.index_of(s[i]) + 
 					(fcr+i)*prim, m, n));
   } else {
     for(i=0;i<nroots;i++)
-      s[i] = data.elem(drow,n-1);
+      s[i] = data(drow,n-1);
 
     for(j=n-1;j>0;j--)
       for(i=0;i<nroots;i++)
 	if(s[i] == 0)
-	  s[i] = data.elem(drow,j-1);
+	  s[i] = data(drow,j-1);
 	else 
-	  s[i] = data.elem(drow,j-1) ^ data.alpha_to(modn(data.index_of(s[i]) +
+	  s[i] = data(drow,j-1) ^ data.alpha_to(modn(data.index_of(s[i]) +
 					(fcr+i)*prim, m, n));
   }
 
@@ -1667,13 +1697,13 @@
       OCTAVE_LOCAL_BUFFER(int, roots, nroots);
       for (int j=0; j <=nn; j++) {
 	// Evaluate generator polynomial at j
-	int val = genpoly.elem(0,0);
+	int val = genpoly(0,0);
 	int indx = genpoly.index_of(j);
 	for (int i=0; i<nroots; i++) {
 	  if (val == 0)
-	    val = genpoly.elem(i+1,0);
+	    val = genpoly(i+1,0);
 	  else
-	    val = genpoly.elem(i+1,0) ^ genpoly.alpha_to(modn(indx +
+	    val = genpoly(i+1,0) ^ genpoly.alpha_to(modn(indx +
 				genpoly.index_of(val), m, nn));
 	}
 	if (val == 0) {
@@ -1737,7 +1767,7 @@
     if (parity_at_end) 
       for (int l = 0; l < nsym; l++)
 	for (int i=n; i > 0; i--)
-	  code.elem(l,i+nn-n-1) = code.elem(l,i-1);
+	  code(l,i+nn-n-1) = code(l,i-1);
   }
 
   for (int l = 0; l < nsym; l++)
@@ -1747,18 +1777,18 @@
     if (parity_at_end) 
       for (int l = 0; l < nsym; l++)
 	for (int i=0; i > n; i--)
-	  code.elem(l,i) = code.elem(l,i+nn-n);
+	  code(l,i) = code(l,i+nn-n);
     code.resize(nsym,n,0);
   }
 
   if (parity_at_end) {
     for (int l = 0; l < nsym; l++)
       for (int i=0; i < k; i++)
-	msg.elem(l,i) = code.elem(l,i);
+	msg(l,i) = code(l,i);
   } else {
     for (int l = 0; l < nsym; l++)
       for (int i=0; i < k; i++)
-	msg.elem(l,i) = code.elem(l,nroots+i);
+	msg(l,i) = code(l,nroots+i);
   }
 
   retval(0) = new octave_galois (msg);
@@ -1892,12 +1922,12 @@
 
       c.resize(nc+1,m);
       cs.resize(nc+1);
-      c.elem(nc,0) = idx; 
+      c(nc,0) = idx; 
       found(c.alpha_to(idx)-1) = 1;
       cs(nc) = 1;
       int r = idx;
       while ((r = modn(r<<1,m,n)) > idx) {
-	c.elem(nc,cs(nc)) = r;
+	c(nc,cs(nc)) = r;
 	found(c.alpha_to(r)-1) = 1;
 	cs(nc) += 1;
       }
@@ -1917,10 +1947,10 @@
 	  for (int j = 2*(t-1); j<2*t; j++) {
 	    int flag = 0;
 	    for (int l=0; l<cs(i); l++) {
-	      if (c.elem(i,l) == j+1) {
+	      if (c(i,l) == j+1) {
 		f.resize(1,nf+cs(i));
 		for (int ll=0; ll<cs(i); ll++)
-		  f.elem(0,nf+ll) = c.elem(i,ll);
+		  f(0,nf+ll) = c(i,ll);
 		found(i) = 0;
 		nf += cs(i);
 		flag = 1;
@@ -1941,21 +1971,21 @@
     // Create polynomial of right length.
     genpoly = galois(nf+1,1,0,m);
 
-    genpoly.elem(0,0) = 1;
+    genpoly(0,0) = 1;
     for (int i = 0; i < nf; i++) {
-      genpoly.elem(i+1,0) = 1;
+      genpoly(i+1,0) = 1;
 
       // Multiply genpoly by  @**(root + x)
       for (int l = i; l > 0; l--){
-	if (genpoly.elem(l,0) != 0)
-	  genpoly.elem(l,0) = genpoly.elem(l-1,0) ^ genpoly.alpha_to(
-		modn(genpoly.index_of(genpoly.elem(l,0)) + f.elem(0,i), m, n));
+	if (genpoly(l,0) != 0)
+	  genpoly(l,0) = genpoly(l-1,0) ^ genpoly.alpha_to(
+		modn(genpoly.index_of(genpoly(l,0)) + f(0,i), m, n));
 	else
-	  genpoly.elem(l,0) = genpoly.elem(l-1,0);
+	  genpoly(l,0) = genpoly(l-1,0);
       }
       // genpoly(0,0) can never be zero
-      genpoly.elem(0,0) = genpoly.alpha_to(modn(genpoly.index_of(
-			genpoly.elem(0,0)) + f.elem(0,i), m, n));
+      genpoly(0,0) = genpoly.alpha_to(modn(genpoly.index_of(
+			genpoly(0,0)) + f(0,i), m, n));
     }
   }
 
@@ -1973,18 +2003,18 @@
   if (parity_at_end) {
     for (int l = 0; l < nsym; l++) {
       for (int i = 0; i < k; i++) { 
-	int feedback = (int)msg.elem(l,i) ^ (int)msg.elem(l,k);
+	int feedback = (int)msg(l,i) ^ (int)msg(l,k);
 	if (feedback != 0) {
 	  for (int j = 0; j < nn-k-1; j++)
-	    if (genpoly.elem(nn-k-j-1,0) != 0)
-	      msg.elem(l,k+j) = (int)msg.elem(l,k+j+1) ^ feedback;
+	    if (genpoly(nn-k-j-1,0) != 0)
+	      msg(l,k+j) = (int)msg(l,k+j+1) ^ feedback;
 	    else
-	      msg.elem(l,k+j) = msg.elem(l,k+j+1);
-	  msg.elem(l,nn-1) = genpoly.elem(0,0) & feedback;
+	      msg(l,k+j) = msg(l,k+j+1);
+	  msg(l,nn-1) = genpoly(0,0) & feedback;
 	} else {
 	  for (int j = k; j < nn-1; j++)
-	    msg.elem(l,j) = msg.elem(l,j+1);
-	  msg.elem(l,nn-1) = 0;
+	    msg(l,j) = msg(l,j+1);
+	  msg(l,nn-1) = 0;
 	}
       }
     }
@@ -1998,18 +2028,18 @@
 
     for (int l = 0; l < nsym; l++) {
       for (int i = k-1; i >= 0; i--) { 
-	int feedback = (int)msg.elem(l,nn-k+i) ^ (int)msg.elem(l,nn-k-1);
+	int feedback = (int)msg(l,nn-k+i) ^ (int)msg(l,nn-k-1);
 	if (feedback != 0) {
 	  for (int j = nn - k -1; j > 0; j--)
-	    if (genpoly.elem(j,0) != 0)
-	      msg.elem(l,j) = (int)msg.elem(l,j-1) ^ feedback;
+	    if (genpoly(j,0) != 0)
+	      msg(l,j) = (int)msg(l,j-1) ^ feedback;
 	    else
-	      msg.elem(l,j) = msg.elem(l,j-1);
-	  msg.elem(l,0) = genpoly.elem(0,0) & feedback;
+	      msg(l,j) = msg(l,j-1);
+	  msg(l,0) = genpoly(0,0) & feedback;
 	} else {
 	  for (int j = nn - k - 1; j > 0; j--)
-	    msg.elem(l,j) = msg.elem(l,j-1);
-	  msg.elem(l,0) = 0;
+	    msg(l,j) = msg(l,j-1);
+	  msg(l,0) = 0;
 	}
       }
     }
@@ -2151,10 +2181,10 @@
     for (int i = 1; i <= t2; i++) {
       for (int j = 0; j < nn; j++) {
 	if (parity_at_end) {
-	  if (code.elem(lsym,nn-j-1) != 0)
+	  if (code(lsym,nn-j-1) != 0)
 	    s(i) ^= tables.alpha_to(modn(i*j,m,n));
 	} else {
-	  if (code.elem(lsym,j) != 0)
+	  if (code(lsym,j) != 0)
 	    s(i) ^= tables.alpha_to(modn(i*j,m,n));
 	}
       }
@@ -2295,10 +2325,10 @@
 	  nerr(lsym) = l(u);
 	  for (int i = 0; i < l(u); i++)
 	    if (parity_at_end)
-	      code.elem(lsym,nn-loc(i)-1) = 
-		(int)code.elem(lsym,nn-loc(i)-1) ^ 1;
+	      code(lsym,nn-loc(i)-1) = 
+		(int)code(lsym,nn-loc(i)-1) ^ 1;
 	    else
-	      code.elem(lsym,loc(i)) = (int)code.elem(lsym,loc(i)) ^ 1;
+	      code(lsym,loc(i)) = (int)code(lsym,loc(i)) ^ 1;
 	} else	/* elp has degree >t hence cannot solve */
 	  nerr(lsym) = -1;
       } else
@@ -2310,11 +2340,11 @@
   if (parity_at_end) {
     for (int l = 0; l < nsym; l++)
       for (int i = 0; i < k; i++)
-	msg.elem(l,i) = code.elem(l,i);
+	msg(l,i) = code(l,i);
   } else {
     for (int l = 0; l < nsym; l++)
       for (int i=0; i < k; i++)
-	msg.elem(l,i) = code.elem(l,nn-k+i);
+	msg(l,i) = code(l,nn-k+i);
   }
   
   retval(0) = octave_value(msg);
--- a/main/comm/gftable.m	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/gftable.m	Tue Apr 01 19:37:15 2003 +0000
@@ -15,7 +15,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 ## -*- texinfo -*-
-## @deftypefn {Function File} gftable (@var{m}, @var{primpoly})
+## @deftypefn {Function File} {} gftable (@var{m}, @var{primpoly})
 ##
 ## This function exists for compatiability with matlab. As the octave galois
 ## fields store a copy of the lookup tables for every field in use internally,
--- a/main/comm/ov-galois.cc	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/ov-galois.cc	Tue Apr 01 19:37:15 2003 +0000
@@ -58,7 +58,7 @@
     Matrix data(r,c);
     for (int i=0; i< r; i++)
       for (int j=0; j< c; j++)
-	data(i,j) = (double)gval.elem(i,j);
+	data(i,j) = (double)gval(i,j);
     retval(0) = octave_value (data);
   } 
 #ifdef GALOIS_DISP_PRIVATES
@@ -249,7 +249,7 @@
 
   for (int i = 0; i < gval.rows(); i++)
     for (int j = 0; j < gval.columns(); j++)
-      data(i,j) = (double)gval.elem(i,j);
+      data(i,j) = (double)gval(i,j);
 
   octave_print_internal (os, data, false, current_print_indent_level ());
   newline (os);
@@ -321,7 +321,7 @@
   retval.resize(rows(),columns());
   for (int i=0; i<rows(); i++)
     for (int j=0; j<columns(); j++)
-      retval(i,j) = gval.elem(i,j);
+      retval(i,j) = gval(i,j);
 
   return retval;
 }
--- a/main/comm/rsdecof.m	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/rsdecof.m	Tue Apr 01 19:37:15 2003 +0000
@@ -15,8 +15,8 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 ## -*- texinfo -*-
-## @deftypefn {Function File} rsdecof (@var{in},@var{out})
-## @deftypefnx {Function File} rsdecof (@var{in},@var{out},@var{t})
+## @deftypefn {Function File} {} rsdecof (@var{in},@var{out})
+## @deftypefnx {Function File} {} rsdecof (@var{in},@var{out},@var{t})
 ##
 ## Decodes an ascii file using a Reed-Solomon coder. The input file is
 ## defined by @var{in} and the result is written to the output file @var{out}.
--- a/main/comm/rsencof.m	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/rsencof.m	Tue Apr 01 19:37:15 2003 +0000
@@ -15,9 +15,9 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 ## -*- texinfo -*-
-## @deftypefn {Function File} rsencof (@var{in},@var{out})
-## @deftypefnx {Function File} rsencof (@var{in},@var{out},@var{t})
-## @deftypefnx {Function File} rsencof (@var{...},@var{pad})
+## @deftypefn {Function File} {} rsencof (@var{in},@var{out})
+## @deftypefnx {Function File} {} rsencof (@var{in},@var{out},@var{t})
+## @deftypefnx {Function File} {} rsencof (@var{...},@var{pad})
 ##
 ## Encodes an ascii file using a Reed-Solomon coder. The input file is
 ## defined by @var{in} and the result is written to the output file @var{out}.
--- a/main/comm/scatterplot.m	Mon Mar 31 20:28:10 2003 +0000
+++ b/main/comm/scatterplot.m	Tue Apr 01 19:37:15 2003 +0000
@@ -15,11 +15,11 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 ## -*- texinfo -*-
-## @deftypefn {Function File} scatterplot (@var{x})
-## @deftypefnx {Function File} scatterplot (@var{x},@var{n})
-## @deftypefnx {Function File} scatterplot (@var{x},@var{n},@var{off})
-## @deftypefnx {Function File} scatterplot (@var{x},@var{n},@var{off},@var{str})
-## @deftypefnx {Function File} scatterplot (@var{x},@var{n},@var{off},@var{str},@var{h})
+## @deftypefn {Function File} {} scatterplot (@var{x})
+## @deftypefnx {Function File} {} scatterplot (@var{x},@var{n})
+## @deftypefnx {Function File} {} scatterplot (@var{x},@var{n},@var{off})
+## @deftypefnx {Function File} {} scatterplot (@var{x},@var{n},@var{off},@var{str})
+## @deftypefnx {Function File} {} scatterplot (@var{x},@var{n},@var{off},@var{str},@var{h})
 ## @deftypefnx {Function File} {@var{h} =} scatterplot (@var{...})
 ##
 ## Display the scatter plot of a signal. The signal @var{x} can be either in
Binary file main/comm/scatterplot.png has changed