From: <ad...@us...> - 2011-06-01 19:35:43
|
Revision: 8300 http://octave.svn.sourceforge.net/octave/?rev=8300&view=rev Author: adb014 Date: 2011-06-01 19:35:33 +0000 (Wed, 01 Jun 2011) Log Message: ----------- Work in progress replacement for the galois field type in the communications package, using the Octave OOP functionality Modified Paths: -------------- trunk/octave-forge/main/gsl/doc/.ps Added Paths: ----------- trunk/octave-forge/main/galois/ trunk/octave-forge/main/galois/COPYING trunk/octave-forge/main/galois/DESCRIPTION trunk/octave-forge/main/galois/INDEX trunk/octave-forge/main/galois/Makefile trunk/octave-forge/main/galois/inst/ trunk/octave-forge/main/galois/inst/@gf/ trunk/octave-forge/main/galois/inst/@gf/all.m trunk/octave-forge/main/galois/inst/@gf/and.m trunk/octave-forge/main/galois/inst/@gf/any.m trunk/octave-forge/main/galois/inst/@gf/conv.m trunk/octave-forge/main/galois/inst/@gf/convmtx.m trunk/octave-forge/main/galois/inst/@gf/ctranspose.m trunk/octave-forge/main/galois/inst/@gf/deconv.m trunk/octave-forge/main/galois/inst/@gf/dftmtx.m trunk/octave-forge/main/galois/inst/@gf/diag.m trunk/octave-forge/main/galois/inst/@gf/display.m trunk/octave-forge/main/galois/inst/@gf/double.m trunk/octave-forge/main/galois/inst/@gf/end.m trunk/octave-forge/main/galois/inst/@gf/eq.m trunk/octave-forge/main/galois/inst/@gf/exp.m trunk/octave-forge/main/galois/inst/@gf/fft.m trunk/octave-forge/main/galois/inst/@gf/filter.m trunk/octave-forge/main/galois/inst/@gf/finite.m trunk/octave-forge/main/galois/inst/@gf/ge.m trunk/octave-forge/main/galois/inst/@gf/gf.m trunk/octave-forge/main/galois/inst/@gf/gt.m trunk/octave-forge/main/galois/inst/@gf/horzcat.m trunk/octave-forge/main/galois/inst/@gf/ifft.m trunk/octave-forge/main/galois/inst/@gf/isempty.m trunk/octave-forge/main/galois/inst/@gf/isinf.m trunk/octave-forge/main/galois/inst/@gf/isna.m trunk/octave-forge/main/galois/inst/@gf/isnan.m trunk/octave-forge/main/galois/inst/@gf/isprimitive.m trunk/octave-forge/main/galois/inst/@gf/le.m trunk/octave-forge/main/galois/inst/@gf/length.m trunk/octave-forge/main/galois/inst/@gf/log.m trunk/octave-forge/main/galois/inst/@gf/lt.m trunk/octave-forge/main/galois/inst/@gf/minpol.m trunk/octave-forge/main/galois/inst/@gf/minus.m trunk/octave-forge/main/galois/inst/@gf/mtimes.m trunk/octave-forge/main/galois/inst/@gf/ne.m trunk/octave-forge/main/galois/inst/@gf/not.m trunk/octave-forge/main/galois/inst/@gf/numel.m trunk/octave-forge/main/galois/inst/@gf/or.m trunk/octave-forge/main/galois/inst/@gf/plus.m trunk/octave-forge/main/galois/inst/@gf/power.m trunk/octave-forge/main/galois/inst/@gf/private/ trunk/octave-forge/main/galois/inst/@gf/private/cachefield.m trunk/octave-forge/main/galois/inst/@gf/private/modn.m trunk/octave-forge/main/galois/inst/@gf/private/promote_and_check.m trunk/octave-forge/main/galois/inst/@gf/rdivide.m trunk/octave-forge/main/galois/inst/@gf/reshape.m trunk/octave-forge/main/galois/inst/@gf/roots.m trunk/octave-forge/main/galois/inst/@gf/size.m trunk/octave-forge/main/galois/inst/@gf/sqrt.m trunk/octave-forge/main/galois/inst/@gf/subsasgn.m trunk/octave-forge/main/galois/inst/@gf/subsindex.m trunk/octave-forge/main/galois/inst/@gf/subsref.m trunk/octave-forge/main/galois/inst/@gf/times.m trunk/octave-forge/main/galois/inst/@gf/transpose.m trunk/octave-forge/main/galois/inst/@gf/uminus.m trunk/octave-forge/main/galois/inst/@gf/uplus.m trunk/octave-forge/main/galois/inst/@gf/vertcat.m trunk/octave-forge/main/galois/inst/convmtx.m trunk/octave-forge/main/galois/inst/cosets.m trunk/octave-forge/main/galois/inst/gftable.m trunk/octave-forge/main/galois/inst/isgalois.m trunk/octave-forge/main/galois/inst/rsdecof.m trunk/octave-forge/main/galois/inst/rsencof.m trunk/octave-forge/main/galois/inst/rsgenpoly.m trunk/octave-forge/main/galois/src/ trunk/octave-forge/main/galois/src/Makefile trunk/octave-forge/main/galois/src/__gfilter__.cc trunk/octave-forge/main/galois/src/__gmtimes__.cc trunk/octave-forge/main/galois/src/isprimitive.cc trunk/octave-forge/main/galois/src/primpoly.cc Added: trunk/octave-forge/main/galois/COPYING =================================================================== --- trunk/octave-forge/main/galois/COPYING (rev 0) +++ trunk/octave-forge/main/galois/COPYING 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,337 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. Property changes on: trunk/octave-forge/main/galois/COPYING ___________________________________________________________________ Added: svn:executable + * Added: trunk/octave-forge/main/galois/DESCRIPTION =================================================================== --- trunk/octave-forge/main/galois/DESCRIPTION (rev 0) +++ trunk/octave-forge/main/galois/DESCRIPTION 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,12 @@ +Name: Galois Field +Version: 0.0.1 +Date: 2008-11-14 +Author: David Bateman +Maintainer: David Bateman +Title: Galois Field Test Package +Description: Test package for new implementation galois field code. +Depends: octave (>= 3.4.0) +Depends: signal (>= 1.0.0) +Autoload: yes +License: GPL version 2 or later +Url: http://octave.sf.net Property changes on: trunk/octave-forge/main/galois/DESCRIPTION ___________________________________________________________________ Added: svn:executable + * Added: trunk/octave-forge/main/galois/INDEX =================================================================== --- trunk/octave-forge/main/galois/INDEX (rev 0) +++ trunk/octave-forge/main/galois/INDEX 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,59 @@ +galois >> Galois +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. + ** ^ = Matrix exponentiation of Galois arrays. + .** .^ = Element by element matrix exponentiation of Galois arrays. + ' .' = Matrix transpose of Galois arrays. + == ~= != > >= < <= = Logical operators on Galois arrays. + all + and + any + conv + convmtx + cosets + deconv + dftmtx + diag + exp + ge + gf + gt + fft + filter + ifft + inv + inverse + isempty + isequal + isgalois + isprimitive + le + length + log + lt + minpol + mtimes + or + power + reshape + roots + polyval + primpoly + size +To be implemented + det + lu + rank + prod + sum + sumsq + ldivide + mldivide + mpower + mrdivide + bchdeco + bchenco + rsdec + rsenc Added: trunk/octave-forge/main/galois/Makefile =================================================================== --- trunk/octave-forge/main/galois/Makefile (rev 0) +++ trunk/octave-forge/main/galois/Makefile 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,29 @@ +sinclude ../../Makeconf + + +PKG_FILES = COPYING DESCRIPTION INDEX $(wildcard src/*) \ + $(wildcard inst/*) +SUBDIRS = src + +.PHONY: $(SUBDIRS) + +pre-pkg:: + @for _dir in $(SUBDIRS); do \ + $(MAKE) -C $$_dir pre-pkg; \ + done + +clean: + @for _dir in $(SUBDIRS); do \ + $(MAKE) -C $$_dir $(MAKECMDGOALS); \ + done + +build:: + @for _dir in $(SUBDIRS); do \ + $(MAKE) -C $$_dir all; \ + done + +check:: build + @$(RM) __check__.m + @find . -name "*.m" -exec grep %\! {} \; -o -name "*.cc" -exec grep %\! {} \; >> __check__.m + @octave -q --eval 'addpath("./src"); addpath("./inst"); test("__check__","normal",stdout);' + @$(RM) __check__.m Property changes on: trunk/octave-forge/main/galois/Makefile ___________________________________________________________________ Added: svn:executable + * Added: trunk/octave-forge/main/galois/inst/@gf/all.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/all.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/all.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,27 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} all (@var{x}, @var{dim}) +## For a Galois array @var{x}, return true if all of the elements along the +## dimension @var{dim} are non-zero. +## @end deftypefn + +function y = all (g, varargin) + y = all (g._x, varargin{:}); +endfunction + +%!assert (all (gf (0:3, 2)), false) +%!assert (all (gf (ones(1,4), 2)), true) Added: trunk/octave-forge/main/galois/inst/@gf/and.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/and.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/and.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,28 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} gt (@var{a}, @var{b}) +## Element-by-element logical and operator for Galois arrays. +## @end deftypefn + +function y = and (a, b) + [a, b] = promote_and_check (a, b); + y = a._x & b._x; +endfunction + +%!assert(gf(1) & gf(1), true) +%!assert(gf(0) & gf(1), false) +%!assert(gf(0) & gf(0), false) Added: trunk/octave-forge/main/galois/inst/@gf/any.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/any.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/any.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,27 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} any (@var{x}, @var{dim}) +## For a Galois array @var{x}, return true if any of the elements along the +## dimension @var{dim} are non-zero. +## @end deftypefn + +function y = any (g, varargin) + y = any (g._x, varargin{:}); +endfunction + +%!assert (any (gf (0:3, 2)), true) +%!assert (any (gf (zeros(1,4), 2)), false) Added: trunk/octave-forge/main/galois/inst/@gf/conv.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/conv.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/conv.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,90 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} conv (@var{a}, @var{b}) +## Convolve two Galois vectors. +## +## @code{y = conv (a, b)} returns a vector of length equal to +## @code{length (a) + length (b) - 1}. +## If @var{a} and @var{b} are polynomial coefficient vectors, @code{conv} +## returns the coefficients of the product polynomial. +## @end deftypefn +## @seealso{deconv} + +function y = conv (a, b) + + if (nargin != 2) + usage ("conv(a, b)"); + endif + + if (!isgalois (a) && !isgalois (b)) + error("conv: at least one argument must be a galois variable"); + elseif (!isgalois (a)) + a = gf(a, b._m, b._prim_poly); + elseif (!isgalois (b)) + b = gf(b, a._m, a._prim_poly); + elseif (a._m != b._m && a._prim_poly != b._prim_poly) + error("conv: both vectors must be in the same galois field"); + endif + + if (min(size(a)) > 1 || min(size(b)) > 1) + error("conv: both arguments must be vectors"); + endif + + la = length (a); + lb = length (b); + + ly = la + lb - 1; + + ## Ensure that both vectors are row vectors. + if (rows (a) > 1) + a = reshape (a, 1, la); + endif + if (rows (b) > 1) + b = reshape (b, 1, lb); + endif + + ## Use the shortest vector as the coefficent vector to filter. + if (la < lb) + if (ly > lb) + ## Can't concatenate galois variables like this yet + ## x = [b, (zeros (1, ly - lb))]; + x = gf([b, (zeros (1, ly - lb))], b._m, b._prim_poly); + else + x = b; + endif + y = filter (a, 1, x); + else + if(ly > la) + ## Can't concatenate galois variables like this yet + ## x = [a, (zeros (1, ly - la))]; + x = gf([a, (zeros (1, ly - la))], a._m, a._prim_poly); + else + x = a; + endif + y = filter (b, 1, x); + endif + +endfunction + +%!test +%! poly1 = gf([2,4,5,1],3); +%! poly2 = gf([1,2],3); +%! mulpoly = conv(poly1, poly2); ## multiplication +%! poly3 = [poly,remd] = deconv(mulpoly, poly2); +%! assert (isequal(poly1,poly3)) +%! assert (!any (remd)) + Added: trunk/octave-forge/main/galois/inst/@gf/convmtx.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/convmtx.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/convmtx.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,57 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} convmtx (@var{a}, @var{n}) +## +## Create matrix to perform repeated convolutions with the same vector +## in a Galois Field. If @var{a} is a column vector and @var{x} is a +## column vector of length @var{n}, in a Galois Field then +## +## @code{convmtx(@var{a}, @var{n}) * @var{x}} +## +## gives the convolution of of @var{a} and @var{x} and is the +## same as @code{conv(@var{a}, @var{x})}. The difference is if +## many vectors are to be convolved with the same vector, then +## this technique is possibly faster. +## +## Similarly, if @var{a} is a row vector and @var{x} is a row +## vector of length @var{n}, then +## +## @code{@var{x} * convmtx(@var{a}, @var{n})} +## +## is the same as @code{conv(@var{x}, @var{a})}. +## @end deftypefn +## @seealso{conv} + +function b = convmtx (a, n) + + if (!isgalois (a)) + error("convmtx: argument must be a galois variable"); + endif + + b = gf(convmtx(a._x, n), a._m, a._prim_poly); +endfunction + +%!test +%! grow = gf (0:7, 3); +%! b = gf([1,0,0,1,0,1,0,1],3); +%! a = gf([1,0,1,1],3); +%! x = gf([1,zeros(1,99)],3); +%! y1 = conv(grow+1, grow); +%! y2 = grow * convmtx(grow+1, length(grow)); +%! assert (all(y1 == y2)); + + Added: trunk/octave-forge/main/galois/inst/@gf/ctranspose.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/ctranspose.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/ctranspose.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,28 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} all (@var{x}, @var{dim}) +## Return the complex conjugate transpose of the Galois array @var{x}. +## This function is equivalent to @code{x'}. +## @end deftypefn + +function y = ctranspose (g); + y = g; + y._x = g._x '; +endfunction + +%!assert(ctranspose(gf(0:3,3)),gf([0:3]',3)) +%!assert(gf(0:3,3)',gf([0:3]',3)) Added: trunk/octave-forge/main/galois/inst/@gf/deconv.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/deconv.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/deconv.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,80 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} deconv (@var{y}, @var{a}) +## Deconvolve two Galois vectors. +## +## @code{[b, r] = deconv (y, a)} solves for @var{b} and @var{r} such that +## @code{y = gconv (a, b) + r}. +## +## If @var{y} and @var{a} are polynomial coefficient vectors, @var{b} will +## contain the coefficients of the polynomial quotient and @var{r} will be +## a remander polynomial of lowest order. +## @end deftypefn +## @seealso{gconv,deconv,conv} + +function [b, r] = deconv (y, a) + + + if (nargin != 2) + usage ("deconv(a, b)"); + endif + + if (!isgalois (y) && !isgalois (a)) + error("deconv: at least one argument must be a galois variable"); + elseif (!isgalois (y)) + y = gf(y, a._m, a._prim_poly); + elseif (!isgalois (a)) + a = gf(a, y._m, y._prim_poly); + elseif (a._m != y._m && a._prim_poly != y._prim_poly) + error("deconv: both vectors must be in the same galois field"); + endif + + if (min(size(a)) > 1 || min(size(y)) > 1) + error("deconv: both arguments must be vectors"); + endif + + la = length (a); + ly = length (y); + + lb = ly - la + 1; + + ## Ensure that both vectors are row vectors. + if (rows (a) > 1) + a = reshape (a, 1, la); + endif + if (rows (y) > 1) + y = reshape (y, 1, ly); + endif + + if (ly > la) + b = filter (y, a, [1, (zeros (1, ly - la))]); + elseif (ly == la) + b = filter (y, a, 1); + else + b = gf(0, y._m, y._prim_poly); + endif + + lc = la + length (b) - 1; + if (ly == lc) + r = y - conv (a, b); + else + ## Can't concatenate galois variables like this yet + ## r = [(zeros (1, lc - ly)), y] - conv (a, b); + r = gf([(zeros (1, lc - ly)), y], y._m, y._prim_poly) - conv (a, b); + endif + +endfunction Added: trunk/octave-forge/main/galois/inst/@gf/dftmtx.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/dftmtx.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/dftmtx.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,83 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{d} = } dftmtx (@var{a}) +## +## Form a matrix, that can be used to perform Fourier transforms in +## a Galois Field. +## +## Given that @var{a} is an element of the Galois Field GF(2^m), and +## that the minimum value for @var{k} for which @code{@var{a} ^ @var{k}} +## is equal to one is @code{2^m - 1}, then this function produces a +## @var{k}-by-@var{k} matrix representing the discrete Fourier transform +## over a Galois Field with respect to @var{a}. The Fourier transform of +## a column vector is then given by @code{dftmtx(@var{a}) * @var{x}}. +## +## The inverse Fourier transform is given by @code{dftmtx(1/@var{a})} +## @end deftypefn + +function d = dftmtx(a) + + if (nargin != 1) + error ("usage: d = dftmtx (a)"); + endif + + if (!isgalois(a)) + error("dftmtx: argument must be a galois variable"); + endif + + m = a._m; + prim = a._prim_poly; + n = 2^a._m - 1; + if (n > 255) + error ([ "dftmtx: argument must be in Galois Field GF(2^m), where" ... + " m is not greater than 8"]); + endif + + if (length(a) ~= 1) + error ("dftmtx: argument must be a scalar"); + endif + + mp = minpol(a); + if ((mp(1) ~= 1) || !isprimitive(mp)) + error("dftmtx: argument must be a primitive nth root of unity"); + endif + + step = log(a); + step = step._x; + row = exp(gf([0:n-1], m, prim)); + d = gf(zeros(n,n),m, prim); + for i=1:n; + d(i,:) = row .^ mod(step*(i-1),n); + end + +endfunction + +%!test +%! m = 3; +%! n = 2.^m - 1; +%! alph = gf(2,m); +%! x = gf(floor(2^m*rand(n,1)),m); +%! fm = dftmtx(alph); +%! ifm = dftmtx(1/alph); +%! y0 = fft(x); +%! y1 = fm * x; +%! assert(all (y0 == y1)) +%! z0 = gifft(y0); +%! z1 = ifm * y1; +%! assert(all (z0 == x)) +%! assert(all (z1 == x)) + Added: trunk/octave-forge/main/galois/inst/@gf/diag.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/diag.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/diag.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,53 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} diag (@var{v}, @var{k}) +## Return a diagonal matrix with Galois vector @var{v} on diagonal @var{k}. +## The second argument is optional. If it is positive, the vector is placed on +## the @var{k}-th super-diagonal. If it is negative, it is placed on the +## @var{-k}-th sub-diagonal. The default value of @var{k} is 0, and the +## vector is placed on the main diagonal. For example, +## +## @example +## diag (gf([1, 2, 3],2), 1) +## ans = +## GF(2^2) array. Primitive Polynomial = D^2+D+1 (decimal 7) +## +## Array elements = +## +## 0 1 0 0 +## 0 0 2 0 +## 0 0 0 3 +## 0 0 0 0 +## @end example +## @end deftypefn + +function y = diag (g, varargin) + y = g; + y._x = diag (y._x, varargin{:}); +endfunction + +%!assert(diag(gf([1; 2; 3], 3)), gf([1, 0, 0; 0, 2, 0; 0, 0, 3], 3)); +%!assert(diag (gf([1; 2; 3], 3), 1), gf([0, 1, 0, 0; 0, 0, 2, 0; 0, 0, 0, 3; 0, 0, 0, 0], 3)); +%!assert(diag (gf([1; 2; 3], 3), 2), gf([0, 0, 1, 0, 0; 0, 0, 0, 2, 0; 0, 0, 0, 0, 3; 0, 0, 0, 0, 0; 0, 0, 0, 0, 0], 3)); +%!assert(diag (gf([1; 2; 3], 3),-1), gf([0, 0, 0, 0; 1, 0, 0, 0; 0, 2, 0, 0; 0, 0, 3, 0], 3)); +%!assert(diag (gf([1; 2; 3], 3),-2), gf([0, 0, 0, 0, 0; 0, 0, 0, 0, 0; 1, 0, 0, 0, 0; 0, 2, 0, 0, 0; 0, 0, 3, 0, 0], 3)); +%!assert(diag (gf([1, 0, 0; 0, 2, 0; 0, 0, 3], 3)), gf([1; 2; 3], 3)); +%!assert(diag (gf([0, 1, 0, 0; 0, 0, 2, 0; 0, 0, 0, 3; 0, 0, 0, 0], 3), 1), gf([1; 2; 3],3)); +%!assert(diag (gf([0, 0, 0, 0; 1, 0, 0, 0; 0, 2, 0, 0; 0, 0, 3, 0], 3), -1), gf([1; 2; 3], 3)); +%!assert(diag (gf(ones(1, 0), 3), 2), gf(zeros (2), 3)); +%!assert(diag (gf(1:3, 3), 4, 2), gf([1, 0; 0, 2; 0, 0; 0, 0], 3)); + Added: trunk/octave-forge/main/galois/inst/@gf/display.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/display.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/display.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,60 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} display (@var{g}) +## Displays a Galois array. +## @end deftypefn + +function display (g) + + if (!isempty (inputname(1))) + fprintf("%s = \n",inputname(1)); + endif + if (g._m == 1) + fprintf ("GF(2) array."); + else + fprintf ("GF(2^%d) array. Primitive Polynomial = ", g._m); + p = g._prim_poly; + m = g._m; + first = true; + for i = m + 1 : -1 : 1 + if (bitget (p, i) != 0) + if (i > 1) + if (first) + first = false; + fprintf("D") + else + fprintf("+D") + endif + if (i != 2) + fprintf("^%d", i - 1); + endif + else + if (first) + first = false; + fprintf("1"); + else + fprintf("+1"); + endif + endif + endif + endfor + fprintf (" (decimal %d)", p); + endif + fprintf("\n\nArray elements = \n\n"); + disp (g._x); + fprintf("\n"); +endfunction Added: trunk/octave-forge/main/galois/inst/@gf/double.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/double.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/double.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,23 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} double (@var{g}) +## Convert a Galois array to a double array. +## @end deftypefn + +function x = double (g) + x = double (g._x); +endfunction Added: trunk/octave-forge/main/galois/inst/@gf/end.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/end.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/end.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,34 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} end (@var{obj}, @var{ind}, @var{num}) +## Return the @code{end} index of a Galois array. +## @end deftypefn + +function r = end (obj, index_pos, num_indices) + dv = size (obj._x); + for i = (num_indices + 1) : length (dv) + dv(num_indices) *= dv(i); + endfor + if (index_pos <= length (dv)) + r = dv (index_pos); + else + r = 1; + endif +endfunction + +%!assert(gf(0:7,3)(end), gf(7,3)) +%!assert(gf([0, 1; 2, 3], 3)(end, 1:2), gf ([2, 3], 3)) Added: trunk/octave-forge/main/galois/inst/@gf/eq.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/eq.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/eq.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,27 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} eq (@var{a}, @var{b}) +## Equivalence operator for Galois arrays. +## @end deftypefn + +function y = eq (a, b) + [a, b] = promote_and_check (a, b); + y = a._x == b._x; +endfunction + +%!assert(gf(1) == gf(1), true) +%!assert(gf(0) == gf(1), false) Added: trunk/octave-forge/main/galois/inst/@gf/exp.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/exp.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/exp.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,30 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} exp (@var{x}) +## Compute the anti-logarithm for each element of @var{x} for a Galois +## array. +## @end deftypefn + +function y = exp (g) + if (any (g._x == g._n)) + warning ("exp: exp of 2^m-1 undefined in galois field"); + endif + y = g; + y._x = reshape (g._alpha_to (g._x + 1), size(g._x)); +endfunction + +%!assert(exp(gf(0:7,3)),gf([1, 2, 4, 3, 6, 7, 5, 0], 3)) Added: trunk/octave-forge/main/galois/inst/@gf/fft.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/fft.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/fft.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,50 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} fft (@var{x}) +## +## If @var{x} is a column vector, finds the FFT over the primitive element +## of the Galois Field of @var{x}. If @var{x} is in the Galois Field +## GF(2^@var{m}), then @var{x} must have @code{2^@var{m} - 1} elements. +## @end deftypefn + +function y = fft(x) + + if (nargin != 1) + error ("usage: y = fft (x)"); + endif + + if (!isgalois(x)) + error("fft: argument must be a galois variable"); + endif + + n = g._n; + if (n > 255) + error ([ "fft: argument must be in Galois Field GF(2^m), where", ... + " m is not greater than 8"]); + endif + + alph = gf(2, x._m, x._prim_poly); + [nr, nc] = size(x); + if ((nc == 1) && (nr == n)) + y = dftmtx(alph) * x; + elseif ((nc == n) && (nr == 1)) + y = (dftmtx(alph) * x')'; + else + error ("fft: argument must be a vector in GF(2^m) of length 2^m-1"); + endif + +endfunction Added: trunk/octave-forge/main/galois/inst/@gf/filter.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/filter.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/filter.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,131 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {y =} filter (@var{b}, @var{a}, @var{x}) +## @deftypefnx {Function File} {[@var{y}, @var{sf}] =} filter (@var{b}, @var{a}, @var{x}, @var{si}) +## +## Digital filtering of vectors in a Galois Field. Returns the solution to +## the following linear, time-invariant difference equation over a Galois +## Field: +## @iftex +## @tex +## $$ +## \\sum_{k=0}^N a_{k+1} y_{n-k} = \\sum_{k=0}^M b_{k+1} x_{n-k}, \\qquad +## 1 \\le n \\le P +## $$ +## @end tex +## @end iftex +## @ifinfo +## +## @smallexample +## N M +## SUM a(k+1) y(n-k) = SUM b(k+1) x(n-k) for 1<=n<=length(x) +## k=0 k=0 +## @end smallexample +## @end ifinfo +## +## @noindent +## where +## @ifinfo +## N=length(a)-1 and M=length(b)-1. +## @end ifinfo +## @iftex +## @tex +## $a \\in \\Re^{N-1}$, $b \\in \\Re^{M-1}$, and $x \\in \\Re^P$. +## @end tex +## @end iftex +## An equivalent form of this equation is: +## @iftex +## @tex +## $$ +## y_n = -\\sum_{k=1}^N c_{k+1} y_{n-k} + \\sum_{k=0}^M d_{k+1} x_{n-k}, \\qquad +## 1 \\le n \\le P +## $$ +## @end tex +## @end iftex +## @ifinfo +## +## @smallexample +## N M +## y(n) = - SUM c(k+1) y(n-k) + SUM d(k+1) x(n-k) for 1<=n<=length(x) +## k=1 k=0 +## @end smallexample +## @end ifinfo +## +## @noindent +## where +## @ifinfo +## c = a/a(1) and d = b/a(1). +## @end ifinfo +## @iftex +## @tex +## $c = a/a_1$ and $d = b/a_1$. +## @end tex +## @end iftex +## +## If the fourth argument @var{si} is provided, it is taken as the +## initial state of the system and the final state is returned as +## @var{sf}. The state vector is a column vector whose length is +## equal to the length of the longest coefficient vector minus one. +## If @var{si} is not supplied, the initial state vector is set to all +## zeros. +## @end deftypefn + +function [y, sf] = filter (b, a, x, si) + if (nargin == 3) + [a, b, x] = promote_and_check (a, b, x); + if (rows(x) == 1) + si = gf (zeros (1, max (length (a), length (b)) - 1), a._m, a._prim_poly); + else + si = gf (zeros (max (length (a), length (b)) - 1, 1), a._m, a._prim_poly); + endif + elseif (nargin > 4) + [a, b, x, si] = promote_and_check (a, b, x, si); + else + print_usage(); + endif + + if (! (isvector (a) && isvector (b) && isvector (x) && isvector (si))) + error ("filter: arguments must be vectors") + endif + + if (numel (a) > numel (b)) + if (rows (b) == 1) + b = [b, zeros(1,numel(a)-numel(b))]; + else + b = [b; zeros(numel(a)-numel(b)),1]; + endif + elseif (numel (a) < numel (b)) + if (rows (a) == 1) + a = [a, zeros(1,numel(b)-numel(a))]; + else + a = [a; zeros(numel(b)-numel(a)),1]; + endif + endif + + [y, sf] = __gfilter__ (b._x, a._x, x._x, si._x, a._m, a._alpha_to, a._index_of); + + sf = gf (sf, x._m, x._prim_poly); + y = gf (y, x._m, x._prim_poly); + +endfunction + +%!test +%! b = gf([2, 0, 0, 1, 0, 2, 0, 1], 2); +%! a = gf([2, 0, 1, 1], 2); +%! x = gf([1, zeros(1,20)], 2); +%! y = filter(b, a, x); +%! assert(y, gf([1, 0, 3, 0, 2, 3, 1, 0, 1, 3, 3, 1, 0, 1, 3, 3, 1, 0, 1, 3, 3], 2)) Added: trunk/octave-forge/main/galois/inst/@gf/finite.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/finite.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/finite.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,24 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} finite (@var{x}) +## Returns a logical array of true values for a Galois Field as all +## elements are finite. +## @end deftypefn + +function y = finite (x) + y = true (size(x)); +endfunction Added: trunk/octave-forge/main/galois/inst/@gf/ge.m =================================================================== --- trunk/octave-forge/main/galois/inst/@gf/ge.m (rev 0) +++ trunk/octave-forge/main/galois/inst/@gf/ge.m 2011-06-01 19:35:33 UTC (rev 8300) @@ -0,0 +1,28 @@ +## Copyright (C) 2011 David Bateman +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This ... [truncated message content] |