<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def power(maf=0.5,beta=0.1, N=100, cutoff=5e-8):
 	""" 	estimate power for a given allele frequency, effect size beta and sample size N 	Assumption: 	 	z-score = beta_ML distributed as p(0) = N(0,1.0(maf*(1-maf)*N))) under the null hypothesis 	the actual beta_ML is distributed as p(alt) = N( beta , 1.0/(maf*(1-maf)N) ) 	 	 	Arguments: 		maf:	minor allele frequency of the SNP 		beta:	effect size of the SNP 		N:		sample size (number of individuals) 	Returns: 		power:	probability to detect a SNP in that study with the given parameters 	"""

	
	"""
	std(snp)=sqrt(2.0*maf*(1-maf)) 
	power = \int 

	beta_ML = (snp^T*snp)^{-1}*snp^T*Y = cov(snp,Y)/var(snp)   
	E[beta_ML]	= (snp^T*snp)^{-1}*snp^T*E[Y]  
				= (snp^T*snp)^{-1}*snp^T*snp * beta
				= beta
	Var[beta_ML]= (snp^T*snp)^{-1}*(snp^T*snp)*(snp^T*snp)^{-1}
				= (snp^T*snp)^{-1}
				= 1/N * var(snp)
				= 1/N * maf*(1-maf)
	"""
	assert maf>=0.0 and maf<=0.5, "maf needs to be between 0.0 and 0.5, got %f" % maf
	if beta<0.0:
		beta=-beta
	std_beta = 1.0/np.sqrt(N*(2.0 * maf*(1.0-maf)))
	non_centrality = beta
	beta_samples = np.random.normal(loc=non_centrality, scale=std_beta)
	n_grid = 100000
	beta_in = np.arange(0.5/(n_grid+1.0),(n_grid-0.5)/(n_grid+1.0),1.0/(n_grid+1.0)) 
	beta_theoretical = ((st.norm.isf(beta_in)* std_beta) + non_centrality)
	pvals = st.chi2.sf( (beta_theoretical/std_beta)*(beta_theoretical/std_beta) ,1.0) 
	
	power = (pvals<cutoff).mean()
	return power, pvals