program assgin7_3a
implicit none
integer :: hashves,widen,iad,maxid,id
character (12) :: iiden
character (1) :: regnum(12)

equivalence(regnum,iiden)

do
read(*,*) id

widen=transfer(iiden,widen)
iad=hashves(widen,3,indb,maxid,3,1,nr)

print*,nr
print*,iad

enddo

end program assgin7_3a

integer function hashves(dat,r,ind,m,n,mode,nr)
! When mode=1 and dat was not there before, dat is written into
! ind("hash",1..r). When mod=0 and dat is not found, this function returns 0.
implicit none
integer :: r,mode,nr,m,n,nk=2000
integer :: ind(n,m),dat(r)
integer :: iaddr,prime(10),ie,iaddress,k,j,izer,ieq,i1,i
data ie/17/,prime/433,53,761,197,1039,31,887,389,277,97/

iaddr=0
do i=1,r
iaddr=iaddr+prime(i)*dat(i)
enddo
iaddress=mod(iabs(iaddr),m)+1

do k=1,nk
j=ind(1,iaddress)
izer=0
ieq=0
do i=1,r
i1=ind(i,iaddress)
if (i1/=dat(i)) ieq=1
if (ind(i,iaddress)/=0) izer=1
enddo
if (izer==0 .or. ieq==0) then
if (izer==0 .and. mode==1) then
do i=1,r
ind(i,iaddress)=dat(i)
enddo
nr=nr+1
endif
if (mode==0 .and.izer==0) then
hashves=0
else
hashves=iaddress
endif
return
endif
iaddress=mod(iaddress+ie-1,m)+1
enddo

print*,'hash matrix small'
print*,m,n,r
stop

end