 #!/usr/local/bin/perl -w
 use strict;
 use warnings;

 my @field = (
     [ 0, 0 ], [ 1, 0 ], [ 2, 0 ],
     [ 0, 1 ], [ 1, 1 ], [ 2, 1 ],
     [ 0, 2 ], [ 1, 2 ], [ 2, 2 ],
 );

   # map re/im => field element number
 my $lookup = { };
 for my $idx (1 .. scalar @field ) {
   my( $re, $im ) = @{ $field[ $idx - 1 ] };
   $lookup->{ $re }->{ $im } = $idx;
 }
 sub mapback {
   my( $re, $im ) = @_;
   return $lookup->{ $re }->{ $im };
 }

 foreach my $day (1..9) {
   foreach my $group (1..9) {
     print "day$day group$group: ";
     print "i", fadd( $day,
          fmult( 2, $group ) ),      " ";
     print "b", fadd( $day,
          fmult( 3, $group ) ),      " ";
     print "b", fadd( $day,
          fmult( 4, $group ) ) +  9, " ";
     print "g", fadd( $day,
          fmult( 5, $group ) ),      " ";
     print "g", fadd( $day,
          fmult( 6, $group ) ) +  9, " ";
     print "g", fadd( $day,
          fmult( 7, $group ) ) + 18, "\n";
   }
   print "\n";
 }

 sub fadd {
   my( $f1, $f2 ) = @_;

   my( $r1, $i1 ) = @{ $field[ $f1 - 1 ] };
   my( $r2, $i2 ) = @{ $field[ $f2 - 1 ] };

   return mapback(
     ( $r1 + $r2 ) % 3,
     ( $i1 + $i2 ) % 3 );
 }

 sub fmult {
   my( $f1, $f2 ) = @_;

   my( $r1, $i1 ) = @{ $field[ $f1 - 1 ] };
   my( $r2, $i2 ) = @{ $field[ $f2 - 1 ] };

   return mapback(
     ( $r1 * $r2 - $i1 * $i2 ) % 3,
     ( $r1 * $i2 + $r2 * $i1 ) % 3 );
 }