def bigFloat_nCr(n, r): ''' Outputs: - ret_val: bigFloat, n choose r ''' ret_val = bf.factorial(n) / (bf.factorial(r) * bf.factorial(n - r)) return ret_val
def factorial(n, approx_threshold=100): # start_time = time.time() if approx_threshold < 0 or n < approx_threshold: result = bf.factorial(n) else: result = math.sqrt(2 * math.pi * n) * bf.pow(n / math.e, n) # end_time = time.time() # print(end_time - start_time) return result
def degdist_bigfloat(self, maxdeg, n, mindeg=0): """Returns the degree distribution from 0 to maxdeg degree. It should be use with the (iterated) link probability measure. Parameters: maxdeg: the maximal degree for we calculate the degree distribution n: the size of the network (the number of vertices) Returns: rho: the degree distribution as a list with length of maxdeg+1. The index k gives the probability of having degree k. """ assert isinstance(n, int) and isinstance(maxdeg, int) and n > maxdeg import bigfloat context = bigfloat.Context(precision=10) divs = self.divs n_intervals = len(divs) lengths = [divs[i] - divs[i - 1] for i in xrange(1, n_intervals)] lengths.insert(0, divs[0]) log_lengths = numpy.log(lengths) # Eq. 5, where ... avgdeg = [ bigfloat.BigFloat(n * sum( [self.probs[i][j] * lengths[j] for j in xrange(n_intervals)]), context=context) for i in xrange(n_intervals) ] #log_factorial = [ 0.5*bigfloat.log(2*math.pi, context=context) + (d+.5)*bigfloat.log(d, context=context) - d # for d in xrange(1,maxdeg+1) ] log_factorial = [ bigfloat.log(bigfloat.factorial(k), context=context) for k in xrange(1, maxdeg + 1) ] log_factorial.insert(0, 0) rho = [bigfloat.BigFloat(0, context=context)] * (maxdeg + 1) # Eq. 4 for i in xrange(n_intervals): # Eq. 5 log_rho_i = [ (bigfloat.mul(k, bigfloat.log(avgdeg[i]), context=context) - log_factorial[k] - avgdeg[i]) for k in xrange(mindeg, maxdeg + 1) ] log_rho_i_length = [ log_rho_i[k] + log_lengths[i] for k in xrange(mindeg, maxdeg + 1) ] for k in xrange(mindeg, maxdeg + 1): rho[k] += bigfloat.exp(log_rho_i_length[k], context=context) return rho
def degdist_bigfloat(self, maxdeg, n, mindeg=0): """Returns the degree distribution from 0 to maxdeg degree. It should be use with the (iterated) link probability measure. Parameters: maxdeg: the maximal degree for we calculate the degree distribution n: the size of the network (the number of vertices) Returns: rho: the degree distribution as a list with length of maxdeg+1. The index k gives the probability of having degree k. """ assert isinstance(n, int) and isinstance(maxdeg, int) and n > maxdeg import bigfloat context = bigfloat.Context(precision=10) divs = self.divs n_intervals = len(divs) lengths = [divs[i] - divs[i-1] for i in xrange(1, n_intervals)] lengths.insert(0, divs[0]) log_lengths = numpy.log(lengths) # Eq. 5, where ... avgdeg = [bigfloat.BigFloat(n*sum([self.probs[i][j]*lengths[j] for j in xrange(n_intervals)]), context=context) for i in xrange(n_intervals)] #log_factorial = [ 0.5*bigfloat.log(2*math.pi, context=context) + (d+.5)*bigfloat.log(d, context=context) - d # for d in xrange(1,maxdeg+1) ] log_factorial = [bigfloat.log(bigfloat.factorial(k), context=context) for k in xrange(1, maxdeg+1)] log_factorial.insert(0, 0) rho = [bigfloat.BigFloat(0, context=context)] * (maxdeg+1) # Eq. 4 for i in xrange(n_intervals): # Eq. 5 log_rho_i = [(bigfloat.mul(k, bigfloat.log(avgdeg[i]), context=context) - log_factorial[k] - avgdeg[i]) for k in xrange(mindeg, maxdeg+1)] log_rho_i_length = [log_rho_i[k] + log_lengths[i] for k in xrange(mindeg, maxdeg+1)] for k in xrange(mindeg, maxdeg+1): rho[k] += bigfloat.exp(log_rho_i_length[k], context=context) return rho
def c(n, k): with precision(bigFloatPrecision): return factorial(n) / factorial(n - k) / factorial(k)
def lasum(self, x): return 1 + sum(bigfloat.pow(x, f) / bigfloat.factorial(f) for f in range(1, self.f))