math.extras: adding bitwise permutation words.

db4
John Benediktsson 2013-04-10 14:29:23 -07:00
parent 86ad529ed7
commit 336e2bfd58
3 changed files with 29 additions and 2 deletions

View File

@ -86,3 +86,11 @@ HELP: round-to-decimal
{ $example "USING: math.extras prettyprint ;" "1.23456 2 round-to-decimal ." "1.23" }
{ $example "USING: math.extras prettyprint ;" "12345.6789 -3 round-to-decimal ." "12000.0" }
} ;
HELP: next-permutation-bits
{ $values { "v" integer } { "w" integer } }
{ $description "Generates the next bitwise permutation with the same number of set bits, given a previous lexicographical value." } ;
HELP: permutation-bits
{ $values { "bit-count" integer } { "bits" integer } { "seq" sequence } }
{ $description "Generates all permutations of numbers with a given bit-count and number of bits." } ;

View File

@ -129,3 +129,13 @@ IN: math.extras.test
{ 5 } [ 3 5 round-to-step ] unit-test
{ 10 } [ 12 5 round-to-step ] unit-test
{ 15 } [ 13 5 round-to-step ] unit-test
{ 0b101 } [ 0b11 next-permutation-bits ] unit-test
{ 0b110 } [ 0b101 next-permutation-bits ] unit-test
{
{
0b00111 0b01011 0b01101 0b01110 0b10011
0b10101 0b10110 0b11001 0b11010 0b11100
}
} [ 3 5 permutation-bits ] unit-test

View File

@ -3,8 +3,8 @@
USING: accessors arrays assocs assocs.extras byte-arrays
combinators combinators.short-circuit compression.zlib fry
grouping kernel locals math math.combinatorics math.constants
math.functions math.order math.primes math.ranges
grouping kernel locals math math.bitwise math.combinatorics
math.constants math.functions math.order math.primes math.ranges
math.ranges.private math.statistics math.vectors memoize random
sequences sequences.extras sets sorting ;
@ -258,3 +258,12 @@ M: float round-to-even
: round-to-step ( x step -- y )
[ [ / round ] [ * ] bi ] unless-zero ;
: next-permutation-bits ( v -- w )
[ dup 1 - bitor 1 + dup ] keep
[ dup neg bitand ] bi@ / -1 shift 1 - bitor ;
: permutation-bits ( bit-count bits -- seq )
[ on-bits dup '[ dup _ >= ] ]
[ on-bits '[ [ next-permutation-bits _ bitand ] keep ] ]
bi* produce nip ;