降幂公式的一个证明

很早就知道了$A^{B}\equiv\ A^{B\ mod \ \varphi(C)\ +\ \varphi(C)} \ (mod\ C) \ \ \ if\ B>=\varphi(C)$  然而一直不知道为什么,现在来证明一下:

 

首先我们来研究一下数列$a^0\ a^1\ a^2\ \cdots\ a^n\ \ (mod\ m)$有什么规律。

当a和m互质的时候:

1.根据欧拉定理$a^{\varphi(m)}\equiv\ 1\ (mod\ m)$ 可以知道这个数列肯定是周期的。且最小周期$T<=\varphi(m)$.

2.最小周期$T$一定是$\varphi(m)$的约数. 证明:

假设$x<y$  且  $a^x \equiv 1\ \ \ a^y \equiv 1\ (mod\ m)$ 

那么必定有$a^{y-x}\ \equiv\ 1\ (mod\ m)$

像欧几里得算法一样迭代下去可以得到$a^{gcd(x,y)}\ \equiv\ 1\ (mod\ m)$.

$a^T \equiv 1\ \ \ a^{\varphi(m)} \equiv 1\ (mod\ m) \rightarrow a^{gcd(T,\varphi(m))}\ \equiv\ 1\ (mod\ m)$

T是最小周期,所以$T<=gcd(T,\varphi(m))$,所以$T=gcd(T,\varphi(m))$,所以$T$是$\varphi(m)$的约数。  证毕。

这种情况下$A^{B}\equiv\ A^{B\ mod \ \varphi(C)\ +\ \varphi(C)} \ (mod\ C) \ \ \ if\ B>=\varphi(C)$ 显然成立。

 

当a和m不互质的时候:

1.我们可以证明该数列除掉前面有限的几项之后,就开始周期重复了.

证明:

只要证明当x足够大时,$a^{x+T}\ \equiv\ a^{x}\ (mod\ m)$ <--> $a^{'}*a^{x-1+T}\ \equiv\ a^{'}*a^{x-1}\ (mod\ m^{'})$。

其中$a^{'}=\frac{a}{gcd(a,m)}\ \ m^{'}=\frac{m}{gcd(a,m)}$

即可以不断拿出一个a,来和m约分,直到$a^{'}$和$m^{'}$互质, 于是两边的$a^{'}$可以约去最后得到$a^{T}\ \equiv\ 1\ (mod\ m^{'})$

取$T = \varphi(m')$显然成立。 由于$\varphi(m)$ 是$\varphi(m')$的倍数,那么取$T = \varphi(m)$也成立。

因此当x足够大的时候有$a^{x+\varphi(m)}\ \equiv\ a^{x}\ (mod\ m)$ 也就是说该数列除掉前面有限的几项之后,就开始周期重复了。

那么,x需要多大才满足这个性质呢?假设x至少要大于等于k才满足这个性质,显然k 取决于a和m能约分多少次。由于每次约分至少除以2,所以k是非常小的。

容易证明$k<\varphi(m)$ 所以我们的降幂公式就是正确的。

ps: 另外一个博客的证明:http://blog.csdn.net/aosakixuan/article/details/51439078

 

转载于:https://www.cnblogs.com/vb4896/p/5938791.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您设计一个一元多项式计算器,并提供升幂和降幂两种输出方式的C++代码。 首先,我们需要定义一个结构体来表示多项式的每一项,包括系数和指数: ```c++ struct Term { float coef; // 系数 int exp; // 指数 }; ``` 接下来,我们可以定义一个类来表示多项式,并实现常见的操作,例如加、减、乘、除等: ```c++ class Polynomial { private: vector<Term> terms; // 用 vector 存储多项式的每一项 public: Polynomial() { terms.push_back({0, 0}); // 初始化为 0 } void clear() { terms.clear(); terms.push_back({0, 0}); // 清空后初始化为 0 } void insert(float coef, int exp) { if (coef != 0) { // 如果系数不为零,则插入一项 for (auto &term : terms) { if (term.exp == exp) { term.coef += coef; return; } } terms.push_back({coef, exp}); } } Polynomial operator+(const Polynomial &rhs) const { Polynomial res; int i = 0, j = 0; while (i < terms.size() && j < rhs.terms.size()) { if (terms[i].exp > rhs.terms[j].exp) { res.insert(terms[i].coef, terms[i].exp); i++; } else if (terms[i].exp < rhs.terms[j].exp) { res.insert(rhs.terms[j].coef, rhs.terms[j].exp); j++; } else { res.insert(terms[i].coef + rhs.terms[j].coef, terms[i].exp); i++; j++; } } while (i < terms.size()) { res.insert(terms[i].coef, terms[i].exp); i++; } while (j < rhs.terms.size()) { res.insert(rhs.terms[j].coef, rhs.terms[j].exp); j++; } return res; } Polynomial operator-(const Polynomial &rhs) const { Polynomial res; int i = 0, j = 0; while (i < terms.size() && j < rhs.terms.size()) { if (terms[i].exp > rhs.terms[j].exp) { res.insert(terms[i].coef, terms[i].exp); i++; } else if (terms[i].exp < rhs.terms[j].exp) { res.insert(-rhs.terms[j].coef, rhs.terms[j].exp); j++; } else { res.insert(terms[i].coef - rhs.terms[j].coef, terms[i].exp); i++; j++; } } while (i < terms.size()) { res.insert(terms[i].coef, terms[i].exp); i++; } while (j < rhs.terms.size()) { res.insert(-rhs.terms[j].coef, rhs.terms[j].exp); j++; } return res; } Polynomial operator*(const Polynomial &rhs) const { Polynomial res; for (auto &a : terms) { for (auto &b : rhs.terms) { res.insert(a.coef * b.coef, a.exp + b.exp); } } return res; } Polynomial operator/(const Polynomial &rhs) const { Polynomial res, dividend = *this, divisor = rhs; while (dividend.terms.size() > 1 || dividend.terms[0].coef != 0) { Term t = dividend.terms.back() / divisor.terms.back(); res.insert(t.coef, t.exp); Polynomial tmp = divisor * Polynomial(t.coef, t.exp); dividend = dividend - tmp; dividend.terms.pop_back(); } reverse(res.terms.begin(), res.terms.end()); return res; } void print(bool increasing) const { if (terms.size() == 1 && terms[0].coef == 0) { cout << "0\n"; return; } bool first = true; for (auto it = terms.rbegin(); it != terms.rend(); it++) { if (it->coef == 0) continue; if (first) { first = false; } else { if (it->coef > 0) { cout << "+"; } } if (it->exp == 0 || it->coef != 1 && it->coef != -1) { cout << it->coef; } else if (it->coef == -1) { cout << "-"; } if (it->exp != 0) { cout << "x"; if (it->exp != 1) { cout << "^" << it->exp; } } } cout << "\n"; } }; ``` 在这个类中,我们重载了加、减、乘、除等运算符,并实现了一个 `print` 函数,用于将多项式输出为字符串。 在 `print` 函数中,我们使用了一个 `bool` 类型的参数 `increasing`,用于控制输出的顺序。如果 `increasing` 为 `true`,则按指数升序输出;否则按指数降序输出。 最后,我们给出一个简单的 `main` 函数作为示例: ```c++ int main() { Polynomial p1, p2; p1.insert(1, 2); p1.insert(2, 1); p1.insert(3, 0); p2.insert(1, 1); p2.insert(1, 0); cout << "p1 = "; p1.print(true); cout << "p2 = "; p2.print(false); Polynomial p3 = p1 + p2; cout << "p1 + p2 = "; p3.print(true); Polynomial p4 = p1 - p2; cout << "p1 - p2 = "; p4.print(false); Polynomial p5 = p1 * p2; cout << "p1 * p2 = "; p5.print(true); Polynomial p6 = p1 / p2; cout << "p1 / p2 = "; p6.print(false); return 0; } ``` 这个程序会输出: ``` p1 = 3x^0+2x^1+1x^2 p2 = x^1+1x^0 p1 + p2 = 1x^0+3x^1+1x^2 p1 - p2 = 1x^2+1x^1+2x^0 p1 * p2 = 1x^1+2x^2+4x^3+3x^4+1x^5 p1 / p2 = 2x^1+1x^0 ``` 以上就是一个简单的一元多项式计算器,并提供了升幂和降幂两种输出方式的C++代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值