王明菱 付云伟 王丽明
摘要:程序设计为解决数学问题提供了可行的思路和方法。借助程序可以快速解决不可积的积分问题、快速求幂问题、矩阵乘法问题、欧几里德问题等数学问题,从应用实例中领悟了程序设计在解决数学问题上的优越性和便利性。
关键词:程序设计;数学;积分;快速幂;矩阵;欧几里德
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)07-0078-04
程序设计与数学之间有着天然的联系,两者相辅相成。数学是程序设计的基础,程序设计基于数学建模,又成为解决数学问题的一种重要途径。实践中,借助程序快速求解了不可积的积分问题、快速求幂问题、矩阵乘法问题、欧几里德问题,用实例证明并展示了程序设计应用于解决数学问题的独特优势和便捷高效。
1 不可积的积分问题
在实际数学运算中,经常要用到各種积分。能够直接积出来的积分已经不是难题,但一旦遇到不可积的积分,人们往往束手无策。作者借助程序将不可积的积分进行了求解。对不可积的积分问题的近似解,提出了两种方法,一种是根据积分的性质以及求积分的基本思想,利用分割取近似的方法,将积分的近似值求出来。另一种是使用Romberg算法,将被积函数展开,并使用梯形法递推公式,以求出积分的值。
1.1分割取近似法(详见附录1:“求积分(近似).cpp”)
分割取近似法是在求定积分的过程中常用的方法。具体方法是,设被积函数为f(x),将积分区间平均分成n等份,每份的宽度为h,则:
实践中,可以用类似于上述实例的求解方法,在求gcd(m,n)的过程中,通过逆推将线性组合表示出来。
扩展欧几里德算法实现:详见附录6:“欧几里德.cpp”。
5 结束语
借助程序快速求解不可积的积分问题、快速求幂问题、矩阵乘法问题、欧几里德问题等实例,从新的视角展示了程序设计在解决数学问题上的应用优越性。利用分割取近似的方法求解积分的近似值,使用Romberg算法展开被积函数,并运用梯形法递推公式求出积分的值,结合满二叉树定律及递归思想,将O(n)求幂的算法优化至[O(log2n)],使用矩阵乘法+快速幂的思想解决斐波那契数列问题等等,为人们在快速求解其他数学问题时提供了新的思路。今后,随着程序设计应用的不断深入,必将使更多更复杂的数学问题迎刃而解。
参考文献:
[1]陈宇.数论及应用[M].哈尔滨:哈尔滨工业大学出版社,2012.
[2]俞勇.ACM国际大学生程序设计竞赛:算法与实现[M].北京:清华大学出版社,2013.
[3]赵一煊.浅析数学与程序设计的关系[J].通讯世界,2015(23):296-297.
[4]刘方明.程序设计中的数学方法[J].电脑知识与技术,2012,8(25):6022-6024.
附录:
1.求积分(近似).cpp
#include
#include
#include
#include
#include
#include
#define MIN_LIMIT 1e-5
#define e 2.71828182
#define pie 3.1415926
#define INF 100000
using namespace std;
int N;
double H,A,B,V,ak[10],bk[10],hk[10];
inline double f(double x)
{
return pie*(A*A*pow(e,-2.0*x*x)+B*B*x+2*A*B*pow(e,-x*x)*pow(x,0.5));
}
template
double simpson(const T &f;,double a,double b,int n)
{
const double h=(b-a)/n;
double ans=f(a)+f(b);
for(int i=1;i ans+=4*f(a+i*h); for(int i=2;i ans+=2*f(a+i*h); return ans*h/3; } int main() { double a,b; while(cin>>a>>b>>A>>B) { cout< } return 0; } 2. 求积分(精确).cpp 3. 快速幂.cpp #include #include #include #include using namespace std; int a,n; int ksm(int a,int n) { if(n<=1)
return a;
int ans=ksm(a,n/2);
ans*=ans;
if(n&1)
ans*=a;
return ans;
}
int main()
{
while(scanf("%d%d",&a;,&n;)!=EOF)
{
printf("%d\n",ksm(a,n));
}
return 0;
}
4. 矩陣乘法.cpp
5. 经典欧几里德.cpp
#include
#include
#include
#include
using namespace std;
typedef long long ll;
ll gcd(ll m,ll n)
{
if(!n)
return m;
return gcd(n,m%n);
}
int main()
{
ll m,n;
while(cin>>m>>n)
{
cout< } return 0; } 6. 扩展欧几里德.cpp #include #include #include #include using namespace std; typedef long long ll; ll exgcd(ll m,ll &x;,ll n,ll &y;) { ll x1,y1,x0,y0; x0=1;y0=0; x1=0;y1=1; ll r=(m%n+n)%n; ll q=(m-r)/n; x=0;y=1; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1;y0=y1; x1=x;y1=y; m=n;n=r;r=m%n; q=(m-r)/n; } return n; } int main() { ll m,n; while(cin>>m>>n) { ll x,y; ll ans=exgcd(m,x,n,y); cout< } return 0; }