123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- % {DSK}PERMUTE.PSL;1 5-FEB-83 15:53:01
- (GLISPOBJECTS
- (HISTOGRAM (LISTOBJECT (MIN INTEGER)
- (MAX INTEGER)
- (TOTAL INTEGER)
- (COUNTS (LISTOF INTEGER)))
- PROP ((PEAKS HISTO-PEAKS))
- MSG ((CREATE HISTO-CREATE)
- (+ HISTO-ADD)))
- (PERMUTATION (LISTOF INTEGER)
- PROP ((LENGTH LENGTH)
- (INVERSE PERM-INVERSE RESULT PERMUTATION))
- MSG ((* COMPOSEBITSHUFFLES RESULT PERMUTATION)))
- )
- (SETQ PERM3S '((7 3 5 1 6 2 4 0)
- (7 5 3 1 6 4 2 0)
- (7 3 6 2 5 1 4 0)
- (7 5 6 4 3 1 2 0)
- (7 6 3 2 5 4 1 0)))
- (SETQ FOLD3S '((3 2 1 0 7 6 5 4)
- (5 4 7 6 1 0 3 2)
- (6 7 4 5 2 3 0 1)))
- (SETQ PERM4S '((15 7 11 3 13 5 9 1 14 6 10 2 12 4 8 0)
- (15 11 7 3 13 9 5 1 14 10 6 2 12 8 4 0)
- (15 7 13 5 11 3 9 1 14 6 12 4 10 2 8 0)
- (15 11 13 9 7 3 5 1 14 10 12 8 6 2 4 0)
- (15 13 7 5 11 9 3 1 14 12 6 4 10 8 2 0)
- (15 13 11 9 7 5 3 1 14 12 10 8 6 4 2 0)
- (15 7 11 3 14 6 10 2 13 5 9 1 12 4 8 0)
- (15 11 7 3 14 10 6 2 13 9 5 1 12 8 4 0)
- (15 7 13 5 14 6 12 4 11 3 9 1 10 2 8 0)
- (15 11 13 9 14 10 12 8 7 3 5 1 6 2 4 0)
- (15 13 7 5 14 12 6 4 11 9 3 1 10 8 2 0)
- (15 13 11 9 14 12 10 8 7 5 3 1 6 4 2 0)
- (15 7 14 6 11 3 10 2 13 5 12 4 9 1 8 0)
- (15 11 14 10 7 3 6 2 13 9 12 8 5 1 4 0)
- (15 7 14 6 13 5 12 4 11 3 10 2 9 1 8 0)
- (15 11 14 10 13 9 12 8 7 3 6 2 5 1 4 0)
- (15 13 14 12 7 5 6 4 11 9 10 8 3 1 2 0)
- (15 13 14 12 11 9 10 8 7 5 6 4 3 1 2 0)
- (15 14 7 6 11 10 3 2 13 12 5 4 9 8 1 0)
- (15 14 11 10 7 6 3 2 13 12 9 8 5 4 1 0)
- (15 14 7 6 13 12 5 4 11 10 3 2 9 8 1 0)
- (15 14 11 10 13 12 9 8 7 6 3 2 5 4 1 0)
- (15 14 13 12 7 6 5 4 11 10 9 8 3 2 1 0)))
- (SETQ FOLD4S '((7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8)
- (11 10 9 8 15 14 13 12 3 2 1 0 7 6 5 4)
- (13 12 15 14 9 8 11 10 5 4 7 6 1 0 3 2)
- (14 15 12 13 10 11 8 9 6 7 4 5 2 3 0 1)))
- % edited: 27-DEC-82 15:36
- % Generate a list of all permutations of length N. The identity
- % permutation is always the first member of the list.
- (DG ALLPERMS (N:INTEGER)
- (RESULT (LISTOF PERMUTATION))
- % (SPECVARS LST)
- (PROG (LST)
- (IF N>5 (ERROR 0 "TOO MANY PERMUTATIONS!"))
- (GENPERMS NIL (IDPERM N))
- (RETURN LST)))
- % edited: 28-DEC-82 11:26
- % Convert N to a list of bit values.
- (DG BINLIST (N,NBITS:INTEGER)
- (RESULT (LISTOF INTEGER))(PROG (L I BIT)
- (I_0)
- (BIT_1)
- (WHILE I<NBITS DO
- (L+_ (IF (LOGAND N BIT)
- =0 THEN 0 ELSE 1))
- (I_+1)
- (BIT_+BIT))
- (RETURN L)))
- % edited: 6-MAY-82 16:33
- % Compute a bit-shuffle of the input according to the specification
- % list LST. LST gives, for each output bit in order, the input bit
- % from which it comes.
- (DE BITSHUFFLE (INPUT LST)
- (PROG (RES)
- (SETQ RES 0)
- (MAPC LST (FUNCTION (LAMBDA (X)
- (SETQ RES (PLUS (PLUS RES RES)
- (COND
- ((NULL X)
- 0)
- ((NOT (NUMBERP X))
- 1)
- ((ZEROP (LOGAND INPUT
- (BITPICK X)))
- 0)
- (T 1)))))))
- (RETURN RES)))
- % edited: 23-JUN-82 15:17
- % Compose two bitshuffles to produce a single bitshuffle which is
- % equivalent.
- (DE COMPOSEBITSHUFFLES (FIRST SECOND)
- (PROG (L)
- (COND ((NOT (EQUAL (SETQ L (LENGTH FIRST))
- (LENGTH SECOND)))
- (ERROR 0 NIL)))
- (RETURN (MAPCAR SECOND (FUNCTION (LAMBDA (X)
- (COND
- ((FIXP X)
- (CAR (PNth FIRST
- (DIFFERENCE L X))))
- (T X))))))))
- % edited: 27-DEC-82 15:44
- (DE DOBITSHUFFLE (INT PERM)
- (BITSHUFFLE INT PERM))
- % edited: 27-DEC-82 15:38
- % Generate all permutations consisting of the list PREV followed by
- % all permutations of the list L. The permutations which are
- % generated are added to the global LST. Called by ALLPERMS.
- (DG GENPERMS (PREV,L: (LISTOF INTEGER))
- (GLOBAL LST: (LISTOF PERMUTATION))(PROG (I TMP N)
- (IF ~L THEN LST+_PREV (RETURN NIL))
- (N_ (LENGTH L))
- (I_0)
- (WHILE (I_+1)
- <=N DO
- (TMP_ (CAR (PNth L I)))
- (GENPERMS (PREV+TMP)
- (L - TMP)))))
- % edited: 30-DEC-82 13:26
- (DG HISTO-ADD (H:HISTOGRAM N:INTEGER)
- (IF N>MAX OR N<MIN THEN (ERROR 0 NIL)
- ELSE TOTAL_+1 (CAR (PNth COUNTS (N - MIN + 1)))
- _+1)H)
- % edited: 2-JAN-83 14:14
- (DG HISTO-CREATE (H:HISTOGRAM)
- (RESULT HISTOGRAM)% Initialize a histogram.
- (TOTAL_0)(COUNTS_ (LISTOFC 0 (MAX - MIN + 1)))H)
- % edited: 2-JAN-83 14:10
- (DG HISTO-PEAKS (H:HISTOGRAM)
- (PROG (THRESH L MX N)
- (MX_0)
- (FOR X IN COUNTS (IF X>MX MX_X))
- (THRESH_MX/2)
- (N_MIN)
- (FOR X IN COUNTS DO (IF X>=THRESH L+_N)
- N_+1)
- (RETURN (REVERSIP L))))
- % edited: 28-DEC-82 11:23
- % Produce an identity permutation of length N.
- (DG IDPERM (N:INTEGER)
- (RESULT PERMUTATION)(PROG (L I)
- (SETQ I 0)
- (WHILE I<N L+_I I_+1)
- (RETURN L)))
- % edited: 28-DEC-82 11:23
- % Make a list of N copies of the constant C.
- (DG LISTOFC (C N:INTEGER)
- (RESULT (LISTOF ATOM))(PROG (I L)
- (I_0)
- (WHILE (I_+1)
- <=N DO L+_C)
- (RETURN L)))
- % edited: 28-DEC-82 11:07
- % Log to the base 2 of an integer, rounded up.
- (DG LOG2 (N:INTEGER)
- (RESULT INTEGER)(PROG (I M)
- (SETQ I 0)
- (SETQ M 1)
- (WHILE M<N DO I_+1 M_+M)
- (RETURN I)))
- % edited: 28-DEC-82 11:03
- % Compute the permutation to be applied to the output of a boolean
- % function of N inputs to account for negating the Mth input.
- (DG NEGINPPERM (N,M:INTEGER)
- (RESULT PERMUTATION)(PROG (TWON TWOM I L)
- (SETQ I 0)
- (TWON_2^N)
- (TWOM_2^M)
- (WHILE I<TWON L+_ (IF (LOGAND I TWOM)
- ~=0 THEN I - TWOM ELSE I+TWOM)
- I_+1)
- (RETURN L)))
- % edited: 28-DEC-82 11:02
- % Create the set of permutations of the set of 2^N outputs
- % corresponding to isomorphisms, i.e., renamings of the N inputs of
- % a boolean function. The identity isomorphism is omitted.
- (DG OUTPERMS (N:INTEGER)
- (RESULT (LISTOF PERMUTATION))(PROG (I TMP RES TWON)
- (TWON_2^N)
- (FOR X IN (CDR (ALLPERMS N))
- DO
- (I_0)
- (TMP_NIL)
- (WHILE I<TWON DO
- (TMP+_ (DOBITSHUFFLE I X))
- (I_+1))
- (RES+_TMP))
- (RETURN RES)))
- % edited: 2-SEP-82 10:47
- (DG PERM-INVERSE (P:PERMUTATION)
- (RESULT PERMUTATION)% edited: 2-SEP-82 10:44
- % Compute the inverse of a permutation.
- (PROG (LST N M I J PP TMP)
- (SETQ I 0)
- (N_P:LENGTH)
- (WHILE I<N DO (J _ N - 1)
- (PP_P)
- (WHILE PP DO (IF (CAR PP)
- =I THEN LST+_J PP_NIL ELSE TMP-_PP J_-1
- (IF ~PP (ERROR 0 NIL))))
- (I_+1))
- (RETURN LST)))
- (PUT 'BITSHUFFLE
- 'GLRESULTTYPE
- 'INTEGER)
- (PUT 'DOBITSHUFFLE
- 'GLRESULTTYPE
- 'INTEGER)
|