*! 2.0.0 NJC 8 December 2022 
*! 1.0.0 NJC 14 November 2011
program find_denom, rclass 
	version 9 
	gettoken percent 0 : 0, parse(,)
	syntax , EPSilon(real)
	
	numlist "`percent'", min(0) max(100)
	local percent `r(numlist)'
	local npc : word count `percent'
	tempname pc 
	matrix `pc' = J(`npc', 1, .) 
	tokenize `percent'
	forval i = 1/`npc' { 
		matrix `pc'[`i', 1] = ``i''
	}
	
	mata: find_denom_v("`pc'", `epsilon')
	display _n "minimum sample size is " scalar(n)
	display "frequencies are `frequencies'"	
	return scalar n = scalar(n)
	return local frequencies "`frequencies'" 
end 

mata : 

mata clear 

void find_denom_v(string scalar vecname, real scalar eps) { 
	real scalar n   
	real vector work, i   
	work = st_matrix(vecname)
	work = select(work, (work :< .)) :/ 100
	eps = eps / 100 
	n = 1 

	while (1) {
		i = round(n :* work)
		if (all((((work :- eps) :* n) :<= i) :& 
			(((work :+ eps) :* n) :>= i))) { 
			st_numscalar("n", n)
			st_local("frequencies", invtokens(strofreal(i')))
			break
		}
		n++ 
	}
} 

end