#!perl -w use strict; use Bit::Vector; # ====================================================================== # $value = $vector->Chunk_Read($bits,$offset); # $vector->Chunk_Store($bits,$offset,$value); # @values = $vector->Chunk_List_Read($bits); # $vector->Chunk_List_Store($bits,@values); # ====================================================================== my $limit = 1013; # Prime number in order to avoid trivial cases my $longbits = Bit::Vector::Long_Bits(); print "1..", 12*$longbits, "\n"; my($set,$tst,$bits,$ok,$i,$offset); my(@primes,@chunks); my(@vec) = Bit::Vector->new($limit,5); $vec[0]->Primes(); # Make sure all chunks here are unique, i.e., mutually different (as far as possible) $vec[3]->Fill(); $tst = $vec[4]; my $k = 0; while ($k < $limit) { $vec[1]->Bit_On($k++); $vec[2]->Bit_On($k++) if ($k < $limit); } my $n = 1; for ( $k = 0; $k < 4; $k++ ) { $set = $vec[$k]; for ( $bits = 1; $bits <= $longbits; $bits++ ) { undef @primes; $tst->Empty(); @primes = $set->Chunk_List_Read($bits); $tst->Chunk_List_Store($bits,@primes); if ($set->equal($tst)) {print "ok $n\n";} else {print "not ok $n\n";print "k = $k\nvect. bits: $limit bits\nchunk size: $bits bits\nset=".$set->to_Hex()."\ntst=".$tst->to_Hex()."\n";$tst->Xor($tst,$set);print "xor=".$tst->to_Hex()."\n";Dump(\@primes,'primes',$bits);} $n++; undef @chunks; $tst->Empty(); $ok = 1; for ( $i = 0, $offset = 0; $offset < $limit; $i++, $offset += $bits ) { $chunks[$i] = $set->Chunk_Read($bits,$offset); if ($primes[$i] != $chunks[$i]) { $ok = 0; } } if ($ok) {print "ok $n\n";} else {print "not ok $n\n";} $n++; for ( $i = 0; $i <= $#chunks; $i++ ) { $tst->Chunk_Store($bits,$i*$bits,$chunks[$i]); } if ($set->equal($tst)) {print "ok $n\n";} else {print "not ok $n\n";print "k = $k\nvect. bits: $limit bits\nchunk size: $bits bits\nset=".$set->to_Hex()."\ntst=".$tst->to_Hex()."\n";$tst->Xor($tst,$set);print "xor=".$tst->to_Hex()."\n";Dump(\@chunks,'chunks',$bits);} $n++; } } sub Dump { my($list,$name,$size) = @_; my($i,$len); my($sum) = 0; $len = $size >> 2; $len++ if ($size & 0x03); for ( $i = 0; $i < @{$list}; $i++ ) { $sum += $bits; printf('$' . $name . "[%02d] = '%0${len}X'; # %d\n", $i, $list->[$i], $sum); } } __END__