Subversion Repositories planix.SVN

Rev

Rev 22 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 22 Rev 26
Line 19... Line 19...
19
{
19
{
20
	mpint *t[2];
20
	mpint *t[2];
21
	int tofree;
21
	int tofree;
22
	mpdigit d, bit;
22
	mpdigit d, bit;
23
	int i, j;
23
	int i, j;
-
 
24
 
-
 
25
	assert(m == nil || m->flags & MPnorm);
-
 
26
	assert((e->flags & MPtimesafe) == 0);
-
 
27
	res->flags |= b->flags & MPtimesafe;
24
 
28
 
25
	i = mpcmp(e,mpzero);
29
	i = mpcmp(e,mpzero);
26
	if(i==0){
30
	if(i==0){
27
		mpassign(mpone, res);
31
		mpassign(mpone, res);
28
		return;
32
		return;
29
	}
33
	}
30
	if(i<0)
34
	if(i<0)
31
		sysfatal("mpexp: negative exponent");
35
		sysfatal("mpexp: negative exponent");
32
 
36
 
33
	t[0] = mpcopy(b);
37
	t[0] = mpcopy(b);
34
	t[1] = res;
38
	t[1] = res;
35
 
39
 
36
	tofree = 0;
40
	tofree = 0;
37
	if(res == b){
41
	if(res == b){
38
		b = mpcopy(b);
42
		b = mpcopy(b);
39
		tofree |= Freeb;
43
		tofree |= Freeb;
40
	}
44
	}
41
	if(res == e){
45
	if(res == e){
42
		e = mpcopy(e);
46
		e = mpcopy(e);
43
		tofree |= Freee;
47
		tofree |= Freee;
44
	}
48
	}
45
	if(res == m){
49
	if(res == m){
Line 55... Line 59...
55
	bit >>= 1;
59
	bit >>= 1;
56
 
60
 
57
	j = 0;
61
	j = 0;
58
	for(;;){
62
	for(;;){
59
		for(; bit != 0; bit >>= 1){
63
		for(; bit != 0; bit >>= 1){
60
			mpmul(t[j], t[j], t[j^1]);
-
 
61
			if(bit & d)
64
			if(m != nil)
62
				mpmul(t[j^1], b, t[j]);
65
				mpmodmul(t[j], t[j], m, t[j^1]);
63
			else
66
			else
-
 
67
				mpmul(t[j], t[j], t[j^1]);
-
 
68
			if(bit & d) {
-
 
69
				if(m != nil)
-
 
70
					mpmodmul(t[j^1], b, m, t[j]);
-
 
71
				else
-
 
72
					mpmul(t[j^1], b, t[j]);
-
 
73
			} else
64
				j ^= 1;
74
				j ^= 1;
65
			if(m != nil && t[j]->top > m->top){
-
 
66
				mpmod(t[j], m, t[j^1]);
-
 
67
				j ^= 1;
-
 
68
			}
-
 
69
		}
75
		}
70
		if(--i < 0)
76
		if(--i < 0)
71
			break;
77
			break;
72
		bit = mpdighi;
78
		bit = mpdighi;
73
		d = e->p[i];
79
		d = e->p[i];
74
	}
-
 
75
	if(m != nil){
-
 
76
		mpmod(t[j], m, t[j^1]);
-
 
77
		j ^= 1;
-
 
78
	}
80
	}
79
	if(t[j] == res){
81
	if(t[j] == res){
80
		mpfree(t[j^1]);
82
		mpfree(t[j^1]);
81
	} else {
83
	} else {
82
		mpassign(t[j], res);
84
		mpassign(t[j], res);