File:  [MW Coherent from dump] / coherent / d / usr / lib / libmp / rpow.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:38 2019 UTC (7 years, 2 months ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

#include "mprec.h"


/*
 *	Rpow sets the mint pointed to by "c" to the mint pointed to by "a"
 *	raised to the mint pointed to by "b" power.  If "b" is negative then
 *	mperr is called with the appropriate error message.
 *	Note that no assumption is made as to the distinctness of "a", "b" and
 *	"c".
 */

void
rpow(a, b, c)
register mint *a, *b, *c;
{
	mint	al, bl;
	int rem;

	if (!ispos(b))
		mperr("negative power");

	/* make local copies of a and b */
	minit(&al);
	mcopy(a, &al);
	minit(&bl);
	mcopy(b, &bl);

	/* form actual power */
	sdiv(&bl, 2, &bl, &rem);
	if (rem != 0)
		mcopy(&al, c);
	else
		mcopy(mone, c);
	while (!zerop(&bl)) {
		mult(&al, &al, &al);
		sdiv(&bl, 2, &bl, &rem);
		if (rem != 0)
			mult(c, &al, c);
	}

	/* clean up garbage */
	mpfree(al.val);
	mpfree(bl.val);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.