⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poly.cal

📁 Calc Software Package for Number Calc
💻 CAL
📖 第 1 页 / 共 2 页
字号:
define poly_mul(a,b) {	local sa,sb,i, j, y;	if (ismat(a)) swap(a,b);	if (ismat(b)) {		y = b;		for (i=matmin(b,1); i <= matmax(b,1); i++)			for (j = matmin(b,2); j<= matmax(b,2); j++)				y[i,j] = a * b[i,j];		return y;	}	obj poly y;	sa=findlist(a); sb=findlist(b);	y.p = listmul(sa,sb);	return y;}define listmul(a,b) {	local da,db, s, i, j, u;	da=size(a)-1; db=size(b)-1;	s=list();	if (da >= 0 && db >= 0) {		for (i=0; i<= da+db; i++) { u=0;			for (j = max(0,i-db); j <= min(i, da); j++)			u += a[[j]]*b[[i-j]]; append (s,u);}}	return s;}define ev(a,t) {	local v, i, j;	if (ismat(a)) {		v = a;		for (i = matmin(a,1); i <= matmax(a,1); i++)			for (j = matmin(a,2); j <= matmax(a,2); j++)				v[i,j] = ev(a[i,j], t);		return v;	}	if (islist(a)) {		v = list();		for (i = 0; i < size(a); i++)			append(v, ev(a[[i]], t));		return v;	}	if (!ispoly(a)) return a;	if (islist(t)) {		v = list();		for (i = 0; i < size(t); i++)			append(v, ev(a, t[[i]]));		return v;	}	if (ismat(t)) return evpm(a.p, t);	return evp(a.p, t);}define evp(s,t) {	local n,v,i;	n = size(s);	if (!n) return 0;	v = s[[n-1]];	for (i = n - 2; i >= 0; i--) v=t * v +s[[i]];	return v;}define evpm(s,t) {	local m, n, V, i, I;	n = size(s);	m = matmax(t,1) - matmin(t,1);	if (matmax(t,2) - matmin(t,2) != m) quit "Non-square matrix";	mat V[m+1, m+1];	if (!n) return V;	mat I[m+1, m+1];	matfill(I, 0, 1);	V = s[[n-1]] * I;	for (i = n - 2; i >= 0; i--) V = t * V + s[[i]] * I;	return V;}pzero = pol(0);x = pol(0,1);varname = "x";define x(t) = ev(x, t);define iszero(a) {	if (ispoly(a))		return !size(a.p);	return a == 0;}define isstring(a) = istype(a, " ");define var(name) {	if (!isstring(name)) quit "Argument of var is to be a string";	varname = name;	return pol(0,1);}define pcoeff(a) {		if (isreal(a)) print a:;		else print "(":a:")":;}define pterm(a,n) {	if (n==0) {		pcoeff(a);		return;	}	if (n==1) {		if (a!=1) {			pcoeff(a);			if (ims) print"*":;		}		print varname:;		return;	}	if (a!=1) {		pcoeff(a);		if (ims) print"*":;	}	print varname:"^":n:;}define plist(s) {	local i, n;	n = size(s);	print "( ":;	if (order == "up") {		for (i=0; i< n-1 ; i++)			print s[[i]]:",",:;		if (n) print s[[i]],")":;		else print "0 )":;	}	else {		if (n) print s[[n-1]]:;		for (i = n - 2; i >= 0; i--)			print ", ":s[[i]]:;		print " )":;	}}define deg(a) = size(a.p) - 1;define polydiv(a,b) {	local d, u, i, m, n, sa, sb, sq;	local obj poly q;	local obj poly r;	sa=findlist(a); sb = findlist(b); sq = list();	m=size(sa)-1; n=size(sb)-1;	if (n<0) quit "Zero divisor";	if (m<n) return list(pzero, a);	d = sb[[n]];	while ( m >= n) { u = sa[[m]]/d;		for (i = 0; i< n; i++) sa[[m-n+i]] -= u*sb[[i]];		push(sq,u); remove(sa); m--;		while (m>=n && sa[[m]]==0) { m--; remove(sa); push(sq,0)}}	while (m>=0 && sa[[m]]==0) { m--; remove(sa);}	q.p = sq;  r.p = sa;	return list(q, r);}define poly_mod(a,b)  {	local u;	u=polydiv(a,b);	return u[[1]];}define poly_quo(a,b) {	local p;	p = polydiv(a,b);	return p[[0]];}define ispmult(a,b) = iszero(a % b);define poly_div(a,b) {	if (!ispmult(a,b)) quit "Result not a polynomial";	return poly_quo(a,b);}define pgcd(a,b) {	local r;	if (iszero(a) && iszero(b)) return pzero;	while (!iszero(b)) {		r = a % b;		a = b;		b = r;	}	return monic(a);}define plcm(a,b) = monic( a * b // pgcd(a,b));define pfgcd(a,b) {	local u, v, u1, v1, s, q, r, d, w;	u = v1 = pol(1); v = u1 = pol(0);	while (size(b.p) > 0) {s = polydiv(a,b);		q = s[[0]];		a = b; b = s[[1]]; u -= q*u1; v -= -q*v1;		swap(u,u1); swap(v,v1);}	d=size(a.p)-1; if (d>=0 && (w= 1/a.p[[d]]) !=1)		 { a *= w; u *= w; v *= w;}	return list(a,u,v);}define monic(a) {	local s, c, i, d, y;	if (iszero(a)) return pzero;	obj poly y;	s = findlist(a);	d = size(s)-1;	for (i=0; i<=d; i++) s[[i]] /= s[[d]];	y.p = s;	return y;}define coefficient(a,n) = (n < size(a.p)) ? a.p[[n]] : 0;define D(a, n) {	local i,j,v;	if (isnull(n)) n = 1;	if (!isint(n) || n < 1) quit "Bad order for derivative";	if (ismat(a)) {		v = a;		for (i = matmin(a,1); i <= matmax(a,1); i++)			for (j = matmin(a,2); j <= matmax(a,2); j++)				v[i,j] = D(a[i,j], n);		return v;	}	if (!ispoly(a)) return 0;	return Dp(a,n);}define Dp(a,n) {	local i, v;	if (n > 1) return Dp(Dp(a, n-1), 1);	obj poly v;	v.p=list();	for (i=1; i<size(a.p); i++) append (v.p, i*a.p[[i]]);	return v;}define cgcd(a,b) {	if (isreal(a) && isreal(b)) return gcd(a,b);	while (a) {		b -= bround(b/a) * a;		swap(a,b);	}	if (re(b) < 0) b = -b;	if (im(b) > re(b)) b *= -1i;	else if (im(b) <= -re(b)) b *= 1i;	return b;}define gcdcoeffs(a) {	local s,i,g, c;	s = a.p;	g=0;	for (i=0; i < size(s) && g != 1; i++)		if (c = s[[i]]) g = cgcd(g, c);	return g;}define interp(X, Y, t) = evalfd(makediffs(X,Y), t);define makediffs(X,Y) {	local U, D, d, x, y, i, j, k, m, n, s;	U = D = list();	n = size(X);	if (size(Y) != n) quit"Arguments to be lists of same size";	for (i = n-1; i >= 0; i--) {		x = X[[i]];		y = Y[[i]];		m = size(U);		if (isnum(y)) {			d = y;			for (j = 0; j < m; j++) {				d = D[[j]] = (D[[j]]-d)/(U[[j]] - x);			}			push(U, x);			push(D, y);		}		else {			s = size(y);			for (k = 0; k < s ; k++) {				d = y[[k]];				for (j = 0; j < m; j++) {					d = D[[j]] = (D[[j]] - d)/(U[[j]] - x);				}			}			for (j=s-1; j >=0; j--) {				push(U,x);				push(D, y[[j]]);			}		}	}	return list(U, D);}define evalfd(T, t) {	local U, D, n, i, v;	if (isnull(t)) t = pol(0,1);	U = T[[0]];	D = T[[1]];	n = size(U);	v = D[[n-1]];	for (i = n-2; i >= 0; i--)		v = v * (t - U[[i]]) + D[[i]];	return v;}define mdet(A) {	local n, i, j, k, I, J;	n = matmax(A,1) - (i = matmin(A,1));	if (matmax(A,2) - (j = matmin(A,2)) != n)		quit "Non-square matrix for mdet";	I = J = list();	k = n + 1;	while (k--) {		append(I,i++);		append(J,j++);	}	return M(A, n+1, I, J);}define M(A, n, I, J) {	local v, J0, i, j, j1;	if (n == 1) return A[ I[[0]], J[[0]] ];	v = 0;	i = remove(I);	for (j = 0; j < n; j++) {		J0 = J;		j1 = delete(J0, j);		v += (-1)^(n-1+j) * A[i, j1] * M(A, n-1, I, J0);	}	return v;}define mprint(A) {	local i,j;	if (!ismat(A)) quit "Argument to be a matrix";	for (i = matmin(A,1); i <= matmax(A,1); i++) {		for (j = matmin(A,2); j <= matmax(A,2); j++)			printf("%8.4d ", A[i,j]);		printf("\n");	}}obj poly a;obj poly b;obj poly c;define a(t) = ev(a,t);define b(t) = ev(b,t);define c(t) = ev(c,t);a=pol(1,4,4,2,3,1);b=pol(5,16,8,1);c=pol(1+2i,3+4i,5+6i);if (config("resource_debug") & 3) {	print "obj poly {p} defined";}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -