数学计算工具i

Cplusplus
happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

数学计算工具i

帖子 #1 happy886rr » 2016年09月27日 16:49

  自己初学C时写的一个命令行下的数学计算工具:“i工具”,参考了很多数学书籍和开源项目,可以求解方程(组),高次方程复数根,计算md5,表达式计算支持十多种数学函数,高精度计算、统计、素数、幻方,计算自然底数e、圆周率π,斐波那契数的计算能力(可计算至第50万项),采用了双引擎素数筛法,强大的盾构机筛引擎可以在几毫秒内随意筛选 九千九百九十九亿 以内的素数(目前第一万亿溢出筛不到,但前9999亿完全可筛),使用素数切片的交互概念,一切都是如此迅捷。由于都采用了最佳算法,所以可以统计几百亿内的素数个数,10亿内的素数和瞬间算出。
下载地址:
i.rar
(30.03 KiB) 下载 22 次
i.rar
(30.03 KiB) 下载 22 次

部分函数代码如下
Code: [全选] [展开/收缩] [Download] (Untitled.c)
  1. /*计算组合数C(n,m)*/
  2. long long combination(long long  n,long long  m)
  3. {
  4.     if(m==1){
  5.         return n;
  6.     }
  7.     else{
  8.         if(m>n/2){m=n-m;}
  9.         long long  sum=1,r[1000],i,j,count=1;
  10.         for(j=n;j>n-m;j--){
  11.             sum*=j,i=1;
  12.             for(i=2;i<=m;i++){
  13.                 if(r[i]==0 && sum%i==0){sum/=i;r[i]=1;count+=1;}
  14.             }
  15.         }
  16.         if(count==m && sum>0){return sum;}
  17.     }
  18.     return -1;
  19. }
  20.  
  21. /*计算排列数P(n,m)*/
  22. int arrangement(long long n,long long m)
  23. {
  24.     long long  sum=1;
  25.     for(int i=1,j=n;i<=m;i++,j--){
  26.         sum*=j;
  27.         if(sum<0){
  28.               return -1;
  29.             break;
  30.         }
  31.    
  32.     }
  33.     return sum;
  34. }
  35.  
  36. /*复元,形如x^n=1*/
  37. void rooti(int n)
  38. {
  39.     for(int i=1;i<=n;i++){
  40.         if(i==n){printf("      x[%2d]=%15.12lf%.12lfi",i,cos(2*i*M_PI/n),sin(2*i*M_PI/n));break;}
  41.         if(sin(2*i*M_PI/n)<0){
  42.             printf("      x[%2d]=%15.12lf%.12lfi\n",i,cos(2*i*M_PI/n),sin(2*i*M_PI/n));
  43.         }
  44.         else{
  45.             printf("      x[%2d]=%15.12lf+%.12lfi\n",i,cos(2*i*M_PI/n),sin(2*i*M_PI/n));
  46.         }    
  47.     }
  48. }
  49.  
  50. /*一元一或二次方程,形如ax^2+bx+c=0*/
  51. void twice(double a, double b, double c)
  52. {
  53.     double x1,x2,den=2*a,delt=b*b-4*a*c;
  54.     if(a==0){
  55.         if(b==0){
  56.             printf("  不是实数方程");
  57.         }
  58.         else{
  59.             printf("  降为一元一次方程\n  实数解为:x=%.12lf",-c/b);
  60.         }
  61.     }
  62.     else{    
  63.         if(delt>0){
  64.             x1=-b/den+sqrt(delt)/den;
  65.             x2=-b/den-sqrt(delt)/den;
  66.             printf("  实数解为:%15.12lf\n            %15.12lf",x1,x2);
  67.         }
  68.         else if(delt==0){
  69.             printf("  重根解为:%15.12lf",-b/den);
  70.         }
  71.         else if(delt<0){
  72.             x1=sqrt(-delt)/den;
  73.             printf("  共轭复根:%15.12lf+%.12lfi\n            %15.12lf-%.12lfi",-b/den,x1,-b/den,x1);
  74.         }
  75.     }
  76. }
  77.  
  78. /*一元三次方程,形如ax^3+bx^2+cx+d=0*/
  79. double thice(double a, double b, double c, double d, int gk)
  80. {
  81.     double A=b*b-3*a*c,B=b*c-9*a*d,C=c*c-3*b*d,delta=B*B-4*A*C;
  82.     if(A==0 && B==0){
  83.         if(gk!=1){printf("  三重实数根为:%15.12lf",-b/(3*a));}
  84.         return -b/(3*a);
  85.     }
  86.     else if(delta>0){
  87.         double Y1=A*b+3*a*(-B+sqrt(delta))/2.0,Y2=A*b+3*a*(-B-sqrt(delta))/2.0;
  88.         Y1=(Y1>0)? pow(Y1,1.0/3.0) :-pow(-Y1,1.0/3.0);
  89.         Y2=(Y2>0)? pow(Y2,1.0/3.0) :-pow(-Y2,1.0/3.0);
  90.         double x1=(-b-Y1-Y2)/(3.0*a);
  91.         double prr=(-2*b+Y1+Y2)/(6.0*a),pri=(Y1-Y2)*sqrt(3)/(6.0*a);
  92.         if(gk!=1){printf("  第一个实根为:%15.12lf\n  另共轭复根为:%15.12lf+%.12lfi\n                %15.12lf-%.12lfi",x1,prr,pri,prr,pri);}
  93.         return x1;
  94.     }
  95.     else if(delta==0){
  96.         if(gk!=1){printf("  二重实数根为:%15.12lf\n  另一实数根为:%15.12lf\n",-B/(2.0*A),-b/a+B/A);}
  97.         if(-B/(2.0*A) > -b/a+B/A){
  98.             return -B/(2.0*A);
  99.         }else{
  100.             return -b/a+B/A;
  101.         }
  102.     }
  103.     else if(delta<0){
  104.         double r=acos((2*A*b-3*a*B)/(2*A*sqrt(A)));    
  105.         double x1=(-b-2.0*sqrt(A)*cos(r/3.0))/(3.0*a);
  106.         double x2=(-b-2*sqrt(A)*cos((r+2*M_PI)/3.0))/(3.0*a);
  107.         double x3=(-b-2*sqrt(A)*cos((r+4*M_PI)/3.0))/(3.0*a);
  108.         if(gk!=1){printf("  三个实数根为:%15.12lf\n                %15.12lf\n                %15.12lf",x1,x2,x3);}
  109.         double tempv;
  110.         if(x1 > x2){
  111.             tempv=x1;
  112.         }else{
  113.             tempv=x2;
  114.         }
  115.         if(tempv > x3){
  116.             return tempv;
  117.         }else{
  118.             return x3;
  119.         }
  120.     }
  121. }
  122.  
  123. /*一元四次方程,形如ax^4+bx^3+cx^2+dx+e=0*/
  124. void foice(double a, double b, double c, double d, double e)
  125. {
  126.     double y,f[4],M,N,P;
  127.     int i;
  128.     b/=a;c/=a;d/=a;e/=a;a=1;
  129.     f[0]=8;
  130.     f[1]=-4.0*c;
  131.     f[2]=-(8.0*e-2.0*b*d);
  132.     f[3]=-e*(b*b-4.0*c)-d*d;
  133.     y=thice(f[0],f[1],f[2],f[3],1);
  134.     M=sqrt(8.0*y+b*b-4.0*c);
  135.     N=b*y-d;
  136.     if(M==0){
  137.         P=sqrt(y*y-e);
  138.         twice(2.0,b,2.0*(y+P));
  139.         printf("\n");
  140.         twice(2.0,b,2.0*(y-P));
  141.     }else{
  142.         twice(2.0,b+M,2.0*(y+N/M));
  143.         printf("\n");
  144.         twice(2.0,b-M,2.0*(y-N/M));
  145.     }
  146. }
  147.  
  148. /*一元五次方程,形如ax^5+bx^4+cx^3+dx^2+ex+f=0*/
  149. void fifth(double a, double b, double c, double d, double e, double f)
  150. {
  151.      double r,x,F,F1;
  152.      b/=a;c/=a;d/=a;e/=a;f/=a;
  153.      a=-1.0;
  154.     do
  155.     {
  156.            x=a;
  157.            F=x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f;
  158.            F1=5*x*x*x*x+4*b*x*x*x+3*c*x*x+2*d*x+e;
  159.            a=x-F/F1;    
  160.     }
  161.     while(fabs(x-a)>=1e-10);
  162.     double e1=-f/x,d1=(e1-e)/x,c1=(d1-d)/x,b1=(c1-c)/x;
  163.     foice(1.0,b1,c1,d1,e1);
  164.     printf ("\n  迭代解为:%15.12lf",x);
  165. }
  166.  
  167. /*斐波那契函数*/
  168. void fib(int n, int k)
  169. {
  170.     int  Fa[110000];
  171.     int  Fb[110000];
  172.     Fa[1]=Fb[1]=1;
  173.     int  i,j,tmp=0,add;
  174.     if(n==0 &&k==0){printf("fib(0) = 0");}
  175.     else if(n==0 &&k==1){printf("∑fib(0) = 0");}
  176.     else if(n<=2 &&k==0){printf("fib(%d) = 1",n);}
  177.     else if(n<=2 &&k==1){printf("∑fib(%d) = %d",n,n);}
  178.     else{
  179.         if(k==1){n+=2;}
  180.         int N=ceil(n*log10((1+sqrt(5))/2)-log10(5)/2);
  181.         for(i=3;i<=n;i++){
  182.             add=0;
  183.             for(j=1;j<=N/9+1;j++){
  184.                 tmp=Fa[j]+Fb[j]+add;
  185.                 Fa[j]=Fb[j];
  186.                 add=tmp/1000000000;
  187.                 Fb[j]=tmp%1000000000;
  188.             }
  189.         }
  190.         if(n<45){
  191.             if(k==1){printf("∑fib(%d) = ",n-2);}else{printf("fib(%d) = ",n);}
  192.             if(k==1){printf("%d",Fb[1]-1);}else{printf("%d",Fb[1]);}
  193.         }
  194.         else if(n>=45){
  195.             if(k==1){printf("∑fib(%d) = ",n-2);}else{printf("fib(%d) = ",n);}
  196.             printf("%d",Fb[N/9+1]);
  197.             for(j=N/9;j>1;j--){printf("%09d",Fb[j]);}
  198.             if(k==1){printf("%09d",Fb[1]-1);}else{printf("%09d",Fb[1]);}
  199.         }
  200.     }
  201. }


具体使用说明
[Happy's "i" Version:1.8]
欢迎使用数学计算工具i

1┌Fibonacci数 i/fib [项数]
└Fibonacci数求和 i/fib.sum [项]
2┌阶乘 i/fac [n]
├底数e i/e [有效位数]
└圆周率π i/pi [有效位数]
3┌统计 i/sti {样本数组}
├求和 i/sum {数组}
└均值 i/ave {数组}
4┌等差求和 i/es [首项] [公差] [项数]
└等比求和 i/eg [首项] [公比] [项数]
5┌圆面积 i/S [半径]
└三角形面积 i/S {三边长}
6┌球体积 i/V [半径]
└圆柱体积 i/V [半径] [圆柱高]
7┌排列计算 i/P [n] [m]
└组合计算 i/C [n] [m]
8┌素数概览 i/pri [范围]
├素数切片 i/pri [始] [末]
├素数统计 i/pri.count [范围]
├第n个素数 i/pri.index [n]
├第n个到第m个素数 i/pri.index [n] [m]
├素性检测 i/pri? [待测数]
└素数累加和 i/pri.sum [范围]
9┌一元n次方程 i/i {方程系数}
├单位复根 i/i [幂]
└方程组模式 i/ii
*工具箱
┌复利计算 i/cpr [本金] [利率] [复利次数]
├年金计算 i/ypr [年金] [利率] [计息期数]
├个税计算 i/pit [收入] [三险一金]
├日期间隔 i/date {开始日期} {结束日期}
├幻方打印 i/mag [阶数]
├高精度四则 i/hip ["表达式"]
└化学元素周期表 i/ele
*Hash计算
┌ 字符串摘要 i/hash ["字符串"]
├md5文件摘要 i/md5 ["文件路径"]
└16位md5摘要 i/md5.16 ["文件路径"]
*Shell>> i/shell
用法:
  1. 举个简单例子,比如我要求1到9的和,有两种写法:
    REM 数组求和
    i/sum 1 2 3 4 5 6 7 8 9
    REM 等差数列求和
    i/es 1 1 9

  2. 查看化学元素周期表,下面的命令瞬间就会出现神奇。
    i/ele

  3. 表达式计算,采用StarWing的灵感结合词法分析,可进行非常丰富的表达式运算。支持多种函数:
    常数类
    pi 3.141592653589
    e 2.718281828489
    通用类
    round 四舍五入
    floor 整取
    ceil 向上舍入
    deg 角度转弧度
    sqrt 开方
    lg 常用对数,以10为底
    ln 自然对数
    // 整除
    % 取余数
    ^ 次方

    三角函数类
    sin、cos、tan
    arcsin、arccos、arctan

    双曲函数类
    sinh、cosh、tanh
    arcsinh、arccosh、arctanh

    请使用命令进入shell计算模式
    REM 进入shell计算模块
    i/shell

      直接输入、或粘贴表达式,即刻出结果。
      示例计算((3*3+2)%6+7.187)*5-7/189,使用如下命令:
    REM 粘贴表达式计算
    >>((3*3+2)%6+7.187)*5-7/189
    = 60.897962962963
    复杂的多函数混合嵌套计算,直接复制粘贴算式就行,计算更本不需要时间。
    >>3+5tan5lnlge+6pi*tanpi+arcsin0.75+lge+lnpi+6pi-tanpi+arcsin0.75+lge+lnpi+6pi*tanpi+arcsin0.75+lge+lnpi+6pi-tanpi+arcsin0.75+lge+lnpi+6pi-tanpi+arcsin0.75+lge/lnpi+6pi-tanpi+arcsin0.75+sin0.75+lge+lnpi//2+5tan5lnlge+6pi*tanpi+arcsin0.75*tanpi+arcsin0.75+lge+lnpi+6pi-tanpi+arcsin0.75+lge+lnpi+6pi-tanpi+arcsin0.75+lge+lnpi+6pi*tanpi+arcsin0.75+lge+lnpi+6pi-tanpi+arcsin0.75+lge+lnpi+6pi-tanpi+arcsin0.75+lge/lnpi+6pi-tanpi+arcsin0.75+sin0.75+lge+lnpi//2+5tan5lnlge+6pi*tanpi+arcsin0.75*tanpi+arcsin0.75+lge+lnpi+6pi-tanpi+arcsin0.75
    = 708.20927815645
    基于词法分析,支持数学风格的书写式,比如计算5*(arctan(cos(sin(ln(lg(2.71828)))))),许多编程语言只能接受这种带有许多括号及*号区分的表达式,但是现在你完全可以不写任何乘号和括号,直接这样写5arctancossinlnlge,i工具会自己识别判断。测试如下:
    REM 加括号和乘号的结果
    >>5*(arctan(cos(sin(ln(lg(2.71828))))))
    答案=3.17898...
    REM 不加括号和乘号的结果
    >>5arctancossinlnlge
    答案=3.17898...

  4. 排列组合计算,比如我要计算双色球中百万大奖的概率是多少?就是算组合数C(33,6)*16的倒数:
    REM 计算组合数C(33,6)
    i/C 33 6
    =1107568
    i/shell 1/(16*1107568)
    =0.000000056430
    REM 只有可怜的亿分之5.643左右的概率
  5. 增加复利、年金、个税计算等实用功能。
    REM 复利计算
    i/CPR [本金] [利率] [复利次数]
    REM 年金计算
    i/YPR [年金] [利率] [计息期数]
    REM 个税计算
    i/PIT [收入] [三险一金]

  6. 打印一个12阶幻方。
    i/mag 12
    ┌────────────────────────┐
    144 2 3 4 5 139 138 8 9 10 11 133
    13 131 15 16 128 18 19 125 21 22 122 24
    25 26 118 117 29 30 31 32 112 111 35 36
    37 38 106 105 41 42 43 44 100 99 47 48
    49 95 51 52 92 54 55 89 57 58 86 60
    84 62 63 64 65 79 78 68 69 70 71 73
    72 74 75 76 77 67 66 80 81 82 83 61
    85 59 87 88 56 90 91 53 93 94 50 96
    97 98 46 45 101 102 103 104 40 39 107 108
    109 110 34 33 113 114 115 116 28 27 119 120
    121 23 123 124 20 126 127 17 129 130 14 132
    12 134 135 136 137 7 6 140 141 142 143 1
    └────────────────────────┘

  7. hash计算模式,支持字符串hash计算:
    i/hash i
    Crc32 : e66c3671
    Md5 : 865c0c0b4ab0e063e5caa3387c1a8741
    Sha1 : 042dc4512fa3d391c5170cf3aa61e6a638f84342
    Sha256: de7d1b721a1e0632b7cf04edf5032c8ecffa9f9a08492152b926f1a5a7e765d7
    文件md5效验
    i/md5 i.exe
    REM 32位md5摘要
    MD5 Code:0a3c2eb8c4de4c0184dda0b9fdd82655
    i/md5.16 i.exe
    REM 16位md5摘要
    MD5 Code:c4de4c0184dda0b9

  8. 高性能的素数分析工具。

      列出100万以内的素数
    i/pri 1000000
    在1000000以内共有78498个素数
    ┌────────────────────────┐
    2 3 5 7 11
    13 17 19 23 29
    31 37 41 43 47
    53 59 61 67 71
    73 79 83 89 97
    ......

    999613 999623 999631 999653 999667
    999671 999683 999721 999727 999749
    999763 999769 999773 999809 999853
    999863 999883 999907 999917 999931
    999953 999959 999961 999979 999983
    └────────────────────────┘
    该范围内最大的素数为:999983
    列出一亿到一亿500之间的素数
    i/pri 100000000 100000500
    在 100000000 到 100000500 区间内共有27个素数
    ┌────────────────────────┐
    100000007 100000037 100000039 100000049 100000073
    100000081 100000123 100000127 100000193 100000213
    100000217 100000223 100000231 100000237 100000259
    100000267 100000279 100000357 100000379 100000393
    100000399 100000421 100000429 100000463 100000469
    100000471 100000493
    └────────────────────────┘
    统计300亿内的素数个数
    i/pri.count 30000000000
    在30000000000以内共有1300005926个素数
    列出第1000万个素数
    i/pri.index 10000000
    第10000000个素数是179424673
    列出第10001个素数到第10050个素数之间的素数
    i/pri.index 10001 10050
    第10001个素数 到 第10050个素数
    ┌────────────────────────┐
    104743 104759 104761 104773 104779
    104789 104801 104803 104827 104831
    104849 104851 104869 104879 104891
    104911 104917 104933 104947 104953
    104959 104971 104987 104999 105019
    105023 105031 105037 105071 105097
    105107 105137 105143 105167 105173
    105199 105211 105227 105229 105239
    105251 105253 105263 105269 105277
    105319 105323 105331 105337 105341
    └────────────────────────┘
    检测一个数是否是素数
    i/pri? 100000357
    100000357 是素数
    计算30亿内的素数和
    i/pri.sum 3000000000
    211169315361937456

  9. 高次方程求解,三次方程参考范盛金的数学公式,四次方程采用费拉里降次为两个二次方程,五次方程没有精确的求根公式,采用牛顿迭代法(利用导线逼近0点)进而降次为四次方程。求解过程非常简单只需要使用/i 开关,将方程的系数输入便可得到所有解(包含复数解)。
      举例,求解方程3x^4+5x^2-6x=9,由于该方程没有x^3项,所以x^3项对应的系数写0,注意到“=9”等号右边的系数取负,因此用i工具来求解应该这样输入:
    i/i 3 0 5 -6 -9
    一元四次方程3x^4+0x^3+5x^2-6x-9=0的解为:
    ┌────────────────────────┐
    共轭复根:-0.252438186547+1.696390660707i
    -0.252438186547-1.696390660707i
    实数解为: 1.293411063722
    -0.788534690627
    └────────────────────────┘
    再如求解等系数方程x^36+x^35+x^34+x^33+...+x^2+x^1+x^0=0,该方程所有系数均为1,共有37个1,所以直接i/i 37
    i/i 37
    等系数方程x^36+x^35+x^34+x^33+x^32+x^31+x^30+x^29+x^28+x^27+x^26+x^25+x^24+x^23+x^22+x^21+x^20+x^19+x^18+x^17+x^16+x^15+x^14+x^13+x^12+x^11+x^10+x^9+x^8+x^7+x^6+x^5+x^4+x^3+x^2+x^1+1=0的解为:
    ┌────────────────────────┐
    x[ 1]= 0.985615910348+0.169000820322i
    x[ 2]= 0.942877445461+0.333139794742i
    x[ 3]= 0.873014113161+0.487694943814i
    x[ 4]= 0.778035754318+0.628219997296i
    x[ 5]= 0.660674723390+0.750672305253i
    ... ...
    ... ...
    x[32]= 0.660674723390-0.750672305253i
    x[33]= 0.778035754318-0.628219997296i
    x[34]= 0.873014113161-0.487694943814i
    x[35]= 0.942877445461-0.333139794742i
    x[36]= 0.985615910348-0.169000820322i
    └────────────────────────┘
    再来看下,智能的自动降次功能
    i/i 0 0 0 0 1 5
    一元五次方程0x^5+0x^4+0x^3+0x^2+1x+5=0的解为:
    ┌────────────────────────┐
    降为一元四次方程
    降为一元三次方程
    降为一元二次方程
    降为一元一次方程
    实数解为:x=-5.000000000000
    └────────────────────────┘
    直接来个五次方程的迭代解
    i/i 1 2 3 4 5 6
    一元五次方程1x^5+2x^4+3x^3+4x^2+5x+6=0的解为:
    ┌────────────────────────┐
    共轭复根:-0.913952173245+1.001776220695i
    -0.913952173245-1.001776220695i
    共轭复根: 0.538952173245+1.158003637160i
    0.538952173245-1.158003637160i
    迭代解为:-2.000000000000
    └────────────────────────┘
上次由 523066680 在 2016年09月28日 15:36,总共编辑 3 次。
原因: 论坛添加[font] 和 [ascii] 标签,更新帖子显示效果

头像
523066680
Administrator
Administrator
帖子: 347
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 31 times
Been thanked: 31 times
联系:

Re: 数学计算工具i

帖子 #2 523066680 » 2016年09月27日 16:54

我暂时占了这一楼哈哈。
要使代码显示带有语法高亮
使用 [codebox] 标签

示例

代码: 全选

[codebox=c file=test.c]代码[/codebox]
在编辑界面BBCODE栏目的下方有个下拉选项可以直接选择语言并插入

happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

Re: 数学计算工具i

帖子 #3 happy886rr » 2016年09月27日 17:01

523066680 写了:我暂时占了这一楼哈哈。
要使代码显示带有语法高亮
使用 [codebox] 标签

哈哈,这个总算学会怎么用了。风格比batchhome好太多。


回到 “C/C++”

在线用户

用户浏览此论坛: 没有注册用户 和 2 访客