我需要计算高达100左右的阶乘数!为了确定一系列硬币翻转式数据是否是随机的,根据贝叶斯概率的维基百科条目. 正如你在那里看到的那样,必要的公式涉及3个因子计算(但是,有趣的是,这些因子计算中的两个是沿着到第三个计算的方式计算的).
我在这里看到了这个问题,但我认为这个整数很快就会被吹灭.我也可以创建一个更加智能的因子计算功能(即,如果我有11!/(7!3!),根据wiki示例,我可以去(11*10*9*8)/ 3!),但这对我来说过早优化,在某种意义上我希望它能够工作,但我并不关心速度(还).
那么,为了获得这个概率,我可以调用什么样的C#库来计算阶乘?我对可以进入阶乘计算的所有可怕性感兴趣,我只想以一种我可以操纵它的方式得到结果.在Math命名空间中似乎没有因子函数,因此问题.
是否有一些数学"最佳"基础可以加速因子计算?
背景:为了好玩,我正在实施我自己的bignum库.( - :这是我的第一个错误吗?:-).我正在通过打印n阶乘(n!)的精确值(十进制)来试验内部表示和回归测试中使用的各种基数.
我的bignum库表示整数并进行乘法的方式,时间与内部表示n!中"1"位的总数成正比.在我的内部表示中使用基数2,4,8,16,2 ^ 8,2 ^ 30等都给出了与任何特定数字完全相同的"1"位总数.
除非我做了一些错误,任何给定的阶乘(N!)在基地18代表具有比在基地10或或基地16或19基地等等(原则)表示相同的值较少的"1"位,使用基础18会使我的bignum库比使用base 10或某些二进制2 ^ w base或base 19运行得更快.我认为这与n这个事实有关!或者是短或具有更多的"尾随零"或两者时在基部18比底座10打印出来,或或基座16或基座19有一些其他,将工作比基部18甚至更好的基础?换句话说,是否存在代表n的基数!比基数18更少的"1"位?
这不是"bignum库和素性测试算法的便利基础是什么?" 因为我怀疑"的最佳基地与被称为是大阶乘整数,有很多的2和3个因素的工作"比"最佳基地不同的与没有任何小的因素,并可能整数工作主要".( - :加快因子计算 - 可能是以其他类型的计算为代价 - 我的第二个错误?:-)
编辑:例如:
(decimal) 16! ==
(decimal ) == 20,922,789,888,000 // uses decimal 14 "1" bits
(dozenal ) == 2,41A,B88,000,000 // uses decimal 10 "1" bits
(hexadecimal) == 130,777,758,000 // uses decimal 18 "1" bits
(octadecimal) == 5F,8B5,024,000 // uses decimal 14 "1" bits
Run Code Online (Sandbox Code Playgroud)
(我或多或少在右边存储数字,没有逗号,加上一些元数据开销).(虽然有人可能认为"当你增加基地将使用更少的'1’比特来表示给定数量"或""如果增加基体,将使用较少的非零数字来表示给定数量",上述示例显示并非总是如此.)
我将每个数字存储为一个小整数("int"或"long int"或"byte").有没有其他合理的方法来存储数字?我很确定我的计算机将这些整数存储为二进制 - 每个"1","2","4","8"和"G"数字使用一个"1"位; 每个"3","5","6","9"和"A"数字使用两个"1"位; 每个"7"和"B"数字使用三个"1"位; 每个"F"数字使用四个"1"位等.
该值(16!)的十进制和十八进制表示都需要14"1"位.所以我在之前的计算中犯了一个错误:对于每个n,代表n!在十进制中,并不总是比在十进制中表示相同的值具有更少的"1"位.但问题仍然存在:是否还有一些其他"最佳"基础需要最少1位的数据才能存储大型因子?
有人问:"你如何存储这些数字?" 嗯,这正是我的问题 - 存储n形式数字的最佳方法是什么!?我 …
有没有办法计算实数的反因子?
例如 - 1.5 ! = 1.32934039
1.5如果我有价值,有没有办法获得回报1.32934039?
我在尝试
http://www.wolframalpha.com/input/?i=Gamma^(-1)[1.32934039]
但那是失败的.
嗨这是一个阶乘方法,但它在控制台打印0请帮助我谢谢
public class Demo {
public static void main(String[] args) {
Demo obj = new Demo();
System.out.println(obj.factorial(500));
}
public int factorial(int n) {
int fact = 1;
for (int i = 2; i <= n; i++) {
fact= fact*i;
}
return fact;
}
Run Code Online (Sandbox Code Playgroud)
编辑:将返回无限!
public class Demo {
public static void main(String[] args) {
Demo obj = new Demo();
System.out.println(obj.factorial(500));
}
public double factorial(long n) {
double fact = 1;
for (int i = 2; i <= n; i++) { …Run Code Online (Sandbox Code Playgroud) 每当我试图获得171的阶乘,我得到INF.170工作正常.是否有可能在脚本中获得171+的阶乘?怎么样?我的功能:
function factorial($n) {
if ($n == 0) return 1;
return $n * factorial($n - 1);
}
Run Code Online (Sandbox Code Playgroud) 我有一个定点bignumber库,想要实现快速阶乘,没有精度损失.
在纸上做了一些数学技巧后,我得到了这个公式:
(4N)!=((2N)!).((2N)!).{ (2N+1).(2N+3).(2N+5)...(4N-1) }.(2^N)/(N!)
Run Code Online (Sandbox Code Playgroud)
这已经非常快了,并且通过一些编程技巧,复杂性接近~ O(log(n)).
要清楚,我目前的实现是:
//---------------------------------------------------------------------------
longnum fact(const DWORD &x,longnum &h) // h return (x>>1)! to speed up computation
{
if (x==0) { h=1; return 1; }
if (x==1) { h=1; return 1; }
if (x==2) { h=1; return 2; }
if (x==3) { h=1; return 6; }
if (x==4) { h=2; return 24; }
int N4,N2,N,i; longnum c,q;
N=(x>>2);
N2=N<<1;
N4=N<<2;
h=fact(N2,q); // get 2N! and N!
c=h*h; for (i=(N2+1)|1;i<=N4;i+=2) c*=i; c/=q; // c= …Run Code Online (Sandbox Code Playgroud) 我写了这个函数来返回给定数字的阶乘
func factorial(_ n: Int) -> Int {
if n == 0 {
return 1
}
else {
return n * factorial(n - 1)
}
}
print( factorial(20) ) // 2432902008176640000
Run Code Online (Sandbox Code Playgroud)
只要给定的数字不超过20,就可以正常工作,因为那样结果会变得太高?
我如何规避这个限制,从而计算出更高数字的阶乘?
我已经四处搜索并找到了Swift的一些bignum库,我这样做是为了学习并熟悉Swift,因此我想自己解决这个问题.
我正在尝试在 F# 中创建一个简单的阶乘函数,它使用用户输入的值(使用控制台,我不知道这是否有任何区别),但我似乎找不到任何解决方案在我的函数中使用用户的值。
open System
let rec fact x =
if x < 1 then 1
else x * fact (x - 1)
let input = Console.ReadLine()
Console.WriteLine(fact input)
Run Code Online (Sandbox Code Playgroud)
它不断地给我错误消息“这个表达式的类型应该是“int”,但这里的类型是“string””。如果有人知道如何使其正常工作(或者至少可以告诉我需要做什么才能将用户输入的值转换为 INT,那将不胜感激。
这是我的程序,但是对于像 100,000 这样的大数字,它的运行速度非常慢,有什么选项可以优化吗?
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
BigInteger sum = BigInteger.valueOf(1);
for (BigInteger i = BigInteger.valueOf(n);
i.compareTo(BigInteger.ZERO) > 0;
i = i.subtract(BigInteger.ONE)) {
sum = sum.multiply(i);
}
System.out.println(sum);
}
}
Run Code Online (Sandbox Code Playgroud) 高效计算 n 阶乘最右边的非零数字
我想计算给定数字的阶乘的最右边的数字并打印它。到目前为止我所做的是:
import math
n = int(input())
fact = math.factorial(n)
print(str(fact).rstrip('0')[-1])
Run Code Online (Sandbox Code Playgroud)
但我仍然受到时间限制,我寻找更快的解决方案。值得注意的是,我必须使用python来解决这个问题。
另外,我要指出的是,n是从1到65536,时间限制是0.5秒,并且我有256兆字节的内存。