C  PROGRAM ONBS
C  ONB DETERMINATION
      CHARACTER*4 LN(16),PL,MN
      COMMON/DCM/NBC,LI(0:31)
      DIMENSION MH(0:31),MV(0:31),MT(0:31,256)
      DIMENSION MO(0:31),KA(0:31)
      DATA IMP/32/
      DATA PL,MN/'   +','   -'/
C   KFA =1 PRINT OF INVERSE OF ONB
      DATA KFA/1/
C   KFB =1 PRINT OF SIGNS OF SQUARES
      DATA KFB/1/
C   INPUT DATA ND DIMENSION OF VEC SPACE
      DATA ND/4/
      MA=0
C   MA=2**ND
      MA = IBSET(MA,ND)
      MB = MA-1
      NB=ND-1
      NBC=NB
  131 FORMAT()
      LT=0
      LX=0
      N=0
      MH(0)=1
  200 N=N+1
      MH(N)=MH(N-1)+1
      IF(N.LT.NB)GO TO 200
  201 CONTINUE
C   MH(0:NB) ARE THE MULTIVECTORS TO BE TESTED
      DO 210 JX=0,NB
      NX=MH(JX)
      LNX=LNGT(NX)
      DO 210 JY=JX+1,NB
      NY=MH(JY)
      LNY=LNGT(NY)
      K=LNX*LNY-LSCL(NX,NY)
      IF(.NOT.BTEST(K,0))GO TO 202
  210 CONTINUE
C   COLUMN TEST MVI COLUMN MULTIVECTORS
      DO 301 I=0,NB
      MV(I)=0
  301 CONTINUE
      DO 302 I=0,NB
      DO 302 J=0,NB
      IF(BTEST(MH(J),I))MV(I)=IBSET(MV(I),J)
  302 CONTINUE
C   COMPARISON WITH TESTED MULTIVECTORS IN MT
      DO 305 L=1,LT
      DO 306 I=0,NB
      DO 307 J=0,NB
      IF(MV(I).EQ.MT(J,L))GO TO 306
  307 CONTINUE
      GO TO 305
  306 CONTINUE
      GO TO 202
  305 CONTINUE
      LT=LT+1
      IF(LT.GT.256)STOP 'ARRAY MT INSUFFICIENT'
      DO 310 I=0,NB
      MT(I,LT)=MV(I)
  310 CONTINUE
C   INVERSE OF ONB
      DO 21 NX=0,NB
      KA(NX)=0
   21 CONTINUE
      J=0
      DO 20 M=1,MB
      IF(J.GT.NB)GO TO 26
      L=0
      DO 22 NX=0,NB
      K=0
      DO 24 I=0,NB
      IF(.NOT.BTEST(M,I))GO TO 24
      IF(BTEST(MH(I),NX))K=K+1
   24 CONTINUE
      IF(.NOT.BTEST(K,0))GO TO 22
      L=L+1
      NY=NX
   22 CONTINUE
      IF(L.NE.1)GO TO 20
C     IF(KA(NY).NE.0)GO TO 20
      MO(J)=M
      J=J+1
      KA(NY)=1
   20 CONTINUE
   26 CONTINUE
      DO 28 NX=0,NB
      IF(KA(NX).EQ.1)GO TO 28
C     WRITE(IMP,121)
C 121 FORMAT('   DETERMINATION OF INVERSE FAILED')
      GO TO 202
   28 CONTINUE
      LX=LX+1
      WRITE(IMP,124)LX
  124 FORMAT(2X,I4)
      DO 311 I=0,NB
      CALL BITS(MH(I))
      WRITE(IMP,122)(LI(K),K=0,NB)
  122 FORMAT(6X,16I4)
  311 CONTINUE
      GO TO (205,204)KFA
  205 CONTINUE
      WRITE(IMP,131)
      WRITE(IMP,125)
  125 FORMAT('     INVERSE')
      WRITE(IMP,131)
      DO 406 I=0,NB
      CALL BITS(MO(I))
      WRITE(IMP,122)(LI(K),K=0,NB)
  406 CONTINUE
      WRITE(IMP,131)
  204 CONTINUE
      GO TO(203,202),KFB
  203 CONTINUE
C   SIGNS OF SQUARES
      DO 404 L=0,MB
      DO 403 J=0,NB
      LG=LNGT(MH(J))
      LG=LG*(LG+1)
      K=0
      IF(BTEST(LG,1))K=1
      DO 405 I=0,NB
      IF(.NOT.BTEST(MH(J),I))GO TO 405
      IF(BTEST(L,I))K=K+1
  405 CONTINUE
      LL=J+1
      IF(.NOT.BTEST(K,0))LN(LL)=PL
      IF(BTEST(K,0))LN(LL)=MN
  403 CONTINUE
      WRITE(IMP,128)L,(LN(LL),LL=1,ND)
  128 FORMAT(2X,I4,16A4)
  404 CONTINUE
      WRITE(IMP,131)
  202 CONTINUE
C   NEXT SET OF MULTIVECTORS
      MH(N)=MH(N)+1
      IF(MH(N).LE.MB)GO TO 201
      MX=MB
  206 N=N-1
      IF(N.LT.0)STOP
      MX=MX-1
      IF(MH(N).EQ.MX)GO TO 206
      MH(N)=MH(N)+1
      GO TO 200
      END
      INTEGER FUNCTION LNGT(NX)
      COMMON/DCM/NB,LI(0:31)
      K=0
      DO 10 I=0,NB
      IF(BTEST(NX,I))K = K + 1
   10 CONTINUE
      LNGT=K
      RETURN
      END
      INTEGER FUNCTION LSCL(NX,NY)
      COMMON/DCM/NB,LI(0:31)
      NU = IAND(NX,NY)
      K=0
      DO 12 I = 0,NB
      IF(BTEST(NU,I))K = K+1
   12 CONTINUE
      LSCL=K
      RETURN
      END
      SUBROUTINE BITS(NX)
      COMMON/DCM/NB,LI(0:31)
      DO 10 I=0,NB
      LI(I)=0
      IF(BTEST(NX,I))LI(I)=1
   10 CONTINUE
      RETURN
      END
