C++符号计算库GiNaC的安装和使用教程


GiNaC是一个C++库.它被设计成方便用户在一个符号计算系统下创建自定义的集成系统,比如将符号操作与计算机科学的更成熟领域(如计算密集型数值应用程序、图形界面等)集成在一起.它是根据GNU通用公共许可证(GPL)的条款和条件分发的(它的开发小组也是极力反对软件专利制度的).GiNaC是一个迭代和递归的缩写:GiNaC is Not a CAS(CAS代表计算机代数系统),是不是有GNU(GNU’s not Unix)那味儿了.

GiNaC最初的动机是被开发为xloops的替代引擎,目前由Maple CAS提供支持.然而,它并不局限于高能物理的应用.它的设计在某种意义上是革命性的,它与其他CAS相反,它不试图提供广泛的代数能力和简单的脚本交互式编程语言,而是接受给定的语言(C++)并通过后续二次开发的代数功能来扩展它.

GiNaC的安装

首先你需要有GNU g++ 4.8.1以上,sed,还有make(这些都没有还是退群算了).然后就是先安装CLN:一个c++的基础数值/符号库.先在这里下载CLN的源代码包,然后我们来编译:

root@hanss-S1-Pro-Series:/MyPath# tar -jvxf cln-1.3.6.tar.bz2
root@hanss-S1-Pro-Series:/MyPath# cd cln-1.3.6
root@hanss-S1-Pro-Series:/MyPath# ./configure
root@hanss-S1-Pro-Series:/MyPath# make
root@hanss-S1-Pro-Series:/MyPath# make check
root@hanss-S1-Pro-Series:/MyPath# make install

反正我在安装CLN过程中没遇到什么问题,那么接下来下载GiNac的源代码包,然后我们来编译:

root@hanss-S1-Pro-Series:/MyPath# tar -jvxf ginac-1.8.0.tar.bz2
root@hanss-S1-Pro-Series:/MyPath# cd ginac-1.8.0
root@hanss-S1-Pro-Series:/MyPath# export CXXFLAGS="-Wall -O2"
root@hanss-S1-Pro-Series:/MyPath# ./configure
root@hanss-S1-Pro-Series:/MyPath# make
root@hanss-S1-Pro-Series:/MyPath# make check
root@hanss-S1-Pro-Series:/MyPath# make install

注意:这里make的时候有可能报错:

...
/bin/bash: no-split: command not found
...

但是等会儿make check的时候发现全都pass了,所以无所谓,估计是文档编译的error不影响功能;

GiNaC的使用

我们用官方文档编译test的时候会出现error while loading shared libraries错误,因此我们先解决这个错误(默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定–prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错.也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去.):

root@hanss-S1-Pro-Series:/MyPath# vim /etc/ld.so.conf

然后添加上"/usr/local/lib"后保存退出:

include ld.so.conf.d/*.conf
/usr/local/lib

最后再刷新一下链接库的缓存即可(注意有新的文件加入/usr/local/lib还得刷新):

root@hanss-S1-Pro-Series:/MyPath# /sbin/ldconfig -v

然后搞个测试程序hello.cc:

#include <iostream>
#include <ginac/ginac.h>
using namespace std;
using namespace GiNaC;
int main()
{symbol x("x"), y("y");ex poly;for (int i=0; i<3; ++i)poly += factorial(i+16)*pow(x,i)*pow(y,2-i);cout << poly << endl;return 0;
}

编译运行:

root@hanss-S1-Pro-Series:/MyPath# g++ hello.cc -o hello -lginac -lcln
root@hanss-S1-Pro-Series:/MyPath# ./hello
355687428096000*x*y+20922789888000*y^2+6402373705728000*x^2

老实说GiNac有许多好用的基础功能,比如多项式表达/多项式的GCD和LCM/代数式替换,可以在这个基础上打造更复杂的符号计算:

多项式表达
// 多项式表达
#include <ginac/ginac.h>
using namespace GiNaC;
int main()
{symbol x("x"), y("y");ex PolyInp = 4*pow(x,3)*y + 5*x*pow(y,2) + 3*y- pow(x+y,2) + 2*pow(y+2,2) - 8;ex Poly = PolyInp.expand();for (int i=Poly.ldegree(x);i<=Poly.degree(x);++i) {cout << "The x^" << i << "-coefficient is "<< Poly.coeff(x,i) << endl;}cout << "As polynomial in y: "<< Poly.collect(y) << endl;
}// The x^0-coefficient is y^2+11*y
// The x^1-coefficient is 5*y^2-2*y
// The x^2-coefficient is -1
// The x^3-coefficient is 4*y
// As polynomial in y: -x^2+(5*x+1)*y^2+(-2*x+4*x^3+11)*y
多项式的GCD和LCM
// 多项式的GCD和LCM
#include <ginac/ginac.h>
using namespace GiNaC;
int main()
{symbol x("x"), y("y"), z("z");ex P_a = 4*x*y + x*z + 20*pow(y, 2) + 21*y*z + 4*pow(z, 2);ex P_b = x*y + 3*x*z + 5*pow(y, 2) + 19*y*z + 12*pow(z, 2);ex P_gcd = gcd(P_a, P_b);// x + 5*y + 4*zex P_lcm = lcm(P_a, P_b);// 4*x*y^2 + 13*y*x*z + 20*y^3 + 81*y^2*z + 67*y*z^2 + 3*x*z^2 + 12*z^3
}
多项式的符号替换
// 多项式的GCD和LCM
#include <ginac/ginac.h>
using namespace GiNaC;
int main()
{symbol x("x"), y("y");ex e1 = 2*x*x-4*x+3;cout << "e1(7) = " << e1.subs(x == 7) << endl;// -> 73ex e2 = x*y + x;cout << "e2(-2, 4) = " << e2.subs(lst{x == -2, y == 4}) << endl;// -> -10cout << subs(a^2+b^2+(x+y)^2,$1^2==$1^3) << endl;// b^3+a^3+(x+y)^3cout << subs(a^4+b^4+(x+y)^4,$1^2==$1^3) << endl;// b^4+a^4+(x+y)^4cout << subs((a+b+c)^2,a+b==x) << endl;// (a+b+c)^2cout << subs((a+b+c)^2,a+b+$1==x+$1) << endl;// (x+c)^2cout << subs(a+2*b,a+b==x) << endl;// a+2*bcout << subs(4*x^3-2*x^2+5*x-1,x==a) << endl;// -1+5*a-2*a^2+4*a^3cout << subs(4*x^3-2*x^2+5*x-1,x^$0==a^$0) << endl;// -1+5*x-2*a^2+4*a^3cout << subs(sin(1+sin(x)),sin($1)==cos($1)) << endl;// cos(1+cos(x))cout << expand(subs(a*sin(x+y)^2+a*cos(x+y)^2+b,cos($1)^2==1-sin($1)^2)) << endl;// a+b
}

引用:

[1] CLN: https://www.ginac.de/CLN

[2] GiNac: https://www.ginac.de

C++符号计算库GiNaC的安装和使用教程相关推荐

  1. Python符号计算库sympy使用笔记

    介绍 sympy是一个非常好用的基于Python的符号计算库,科技做微分.积分.极限等一系列高等数学运算,可以帮我们自动的进行符号化计算,即带入运算的不是某个具体的数值, 而是抽象的数学符号, 并且还 ...

  2. 六丶青龙的依赖库+拉库+互助安装及使用教程

    六丶青龙的依赖库+互助安装及使用教程 没有服务器的先自行购买,这里推荐腾讯云2H4G8M首年70–点击购买 青龙面板安装教程 QQ交流:1014549449 --------------点击跳转 青龙 ...

  3. 下面不属于python第三方库的安装方法的是-python第三方库的pip安装方法

    安装python第三方库的三种方法 方法1:使用pip命令 方法2:集成安装方法 方法3:文件安装方法 一.pip命令安装方法(需要联网): pip安装方法简单讲就是使用python自带的pip安装工 ...

  4. Py之Pandas:Python的pandas库简介、安装、使用方法详细攻略

    Py之Pandas:Python的pandas库简介.安装.使用方法详细攻略 目录 pandas库简介 pandas库安装 pandas库使用方法 1.函数使用方法 2.使用经验总结 3.绘图相关操作 ...

  5. python安装第三方库太慢_Python 安装第三方库 pip install 安装慢安装不上的解决办法...

    今天来说一下,有些刚刚接触python的朋友,在使用pip install安装python 第三方库的过程中 会出现网速很慢,或者是安装下载到中途,停止,卡主,或者是下载报错等问题.如下图: 还有一些 ...

  6. mac php gd库,mac下安装GD库FreeType

    MacBook Pro安装的新系统10.10.3,PHP环境也是默认就有的,GD库在默认情况下也安装过了,但在使用验证码的时候,提示GD库不支持FreeType,这里我们手动安装一下. 法一: 安装 ...

  7. Python机器学习库sklearn的安装

    Python机器学习库sklearn的安装 scikit-learn是Python的一个开源机器学习模块,它建立在NumPy,SciPy和matplotlib模块之上能够为用户提供各种机器学习算法接口 ...

  8. buildroot自带程序(库)编译并安装

    前几天情绪有点低落,经过周末的调整重新恢复状态,谢谢有爱的朋友们留言和点赞,有你们的陪伴我会更加努力,让我们一起开心写程序..... buildroot简介: 引用官方的简述: Buildroot是一 ...

  9. Quartus软件及器件库下载及安装

    quartus软件及器件库下载与安装 Altera官网下载地址:https://fpgasoftware.intel.com/13.0sp1/?edition=subscription&pla ...

最新文章

  1. C#学习视频分享与开发技术QQ交流群
  2. 文件处理之解决使用 feof(c语言)或(fin.eof())出现多读问题
  3. P1111 修复公路
  4. python爬虫案例——csdn数据采集
  5. Sql Server 2008开发版(Developer Edition)过期升级企业版(Enterprise Edition)失败后安装学习版...
  6. 孪生再世代表数字几_能科股份:智能制造需求旺盛,中标多领域数字孪生项目
  7. 获取局域网电脑序列号
  8. python 打开网页并截图_python实现自动网页截图并裁剪图片
  9. ITSM体系的整体目的
  10. java实现图片上传后裁剪,把白色背景变成透明图(电子印章)
  11. 电路级静电防护设计技巧与ESD防护方法
  12. JVM虚拟机——初识
  13. C#中服务器端以太网通讯(一对一)
  14. 第一次PLC接线——PLC、电磁阀
  15. python-docx表格两次输入换行_Python Docx回车
  16. 用U盘安装系统完美教程
  17. 精美苹果cms影视双端同步APIcloud混合原生APP源码
  18. 博士生和他们的导师是什么关系
  19. 利用高权重网站借力操作关键词快速排名!
  20. 2022-2028年中国维生素B3行业市场调查研究及投资策略研究报告

热门文章

  1. 如何设计金融机构多场景关键应用下的存储架构
  2. 【Unity3D开发小游戏】《VVVVVV游戏》Unity开发教程
  3. [Opencv](python)直方图均衡化与直方图比较
  4. 如何用UE5渲染一个可爱的茶壶屋?
  5. Windows系统图标变成白框解决方法——以Windows11加密WIFI显示白框为例
  6. 极光大数据告诉你,程序员们都在愁些啥?
  7. 精华汇总:医学数据集及机器学习项目
  8. 【毕设】六足机器人的设计
  9. word文档背景绿色怎么关闭
  10. lpvoid 在 win32 api 中的使用