简单的数论函数模板

$\tau\left( n\right) = (n_1+1)(n_2+1)\cdot \cdot \cdot (n_k+1)$

typedef unsigned long long ll;
ll tau(ll n){//除数函数
	ll res=1,t=2,p;
	while(n>t){
		p=1;
		while(!(n%t)){
			n/=t;
			++p;
		}
		res*=p;
		++t;
	}
	if(n!=1) res<<=1;
	return res;
}
//javascript 移植
function tau(n){
  var res=1;var t=2;var p;
  while(n>t){
    p=1;
    while(!(n%t)){
      n/=t;
      ++p;
    }
    res*=p;
    ++t;
  }
  if(n!=1) res<<=1;
  return res;
}

$\sigma(n)$

除数和函数

typedef unsigned long long ll;
ll sigma(ll n){
	ll res=1,t=2,tp;
	while(n>t){
		tp=t;
		while(!(n%t)){
			n/=t;
			tp*=t;
		}
		res*=(tp-1)/(t-1);
		++t;
	}
	if(n!=1) res*=n+1;
	return res;
}
function sigma(n){
  var res=1;var t=2;var tp;
  while(n>t){
    tp=t;
    while(!(n%t)){
      n/=t;
      tp*=t;
    }
    res*=(tp-1)/(t-1);
    ++t;
  }
  if(n!=1) res*=n+1;
  return res;
}

 分解质因数(javascript,O(2^(n/2)),同理上面的可以这样优化)

function factor(n){
  var res={};var t=2;var p;
  while(n>=t*t){
    p=0;
    while(!(n%t)){
      n/=t;
      ++p;
    }
    if(p) res[t]=p;
    ++t;
  }
  if(n!=1) res[n]=1;
  return res;
}

  

posted @ 2014-12-05 19:54  zball  阅读(233)  评论(1编辑  收藏  举报