exp()近似计算,exp快速算法,C语言实现exp

本文介绍一种快速计算exp()函数的算法,算法简单,精度高,运算速度快,可以在普通单片机上实现。

原理:

当取 n=256 时,就能得到非常好的近似效果。

 算法实现:

1.n次方的算法:

          例: x^16 = (((x^2)^2)^2)2

                   代码实现:

                   x *= x;

                   x *= x;

                   x *= x;

                   x *= x;

                   这就是 x^16 的结果。

 

2.计算exp(x)

取n=256=2^8

 

代码实现:

Double exp(double x)

{

           x = 1.0 + x/256;

           x *= x;       x *= x;       x *= x;       x *= x;

           x *= x;       x *= x;       x *= x;       x *= x;

           return x;

}

算法优点:这里避免了指数运算,大大提高了运算速度。如果直接运算,则需要256次乘法。该算法只需要8次乘法即可实现。

执行结果(红色为实际曲线,蓝色为近似曲线,n越大越接近):

  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是RSA加密算法C语言实现的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> typedef struct { int p; int q; int n; int e; int d; } KeyPair; int gcd(int a, int b) { int r; while (b > 0) { r = a % b; a = b; b = r; } return a; } int isPrime(int n) { int i; if (n <= 1) { return 0; } for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) { return 0; } } return 1; } int generatePrime() { int p; do { p = rand() % 100 + 2; } while (!isPrime(p)); return p; } int generateE(int phi) { int e; do { e = rand() % phi; } while (gcd(e, phi) != 1); return e; } int modExp(int base, int exp, int mod) { int result = 1; while (exp > 0) { if (exp % 2 == 1) { result = (result * base) % mod; } base = (base * base) % mod; exp /= 2; } return result; } int generateD(int e, int phi) { int d = 0; while ((d * e) % phi != 1) { d++; } return d; } KeyPair generateKeyPair() { KeyPair keyPair; int p, q, phi; p = generatePrime(); q = generatePrime(); while (q == p) { q = generatePrime(); } keyPair.p = p; keyPair.q = q; keyPair.n = p * q; phi = (p - 1) * (q - 1); keyPair.e = generateE(phi); keyPair.d = generateD(keyPair.e, phi); return keyPair; } int encrypt(int message, int e, int n) { return modExp(message, e, n); } int decrypt(int cipherText, int d, int n) { return modExp(cipherText, d, n); } int main() { int message = 123; KeyPair keyPair = generateKeyPair(); int cipherText = encrypt(message, keyPair.e, keyPair.n); int decryptedMessage = decrypt(cipherText, keyPair.d, keyPair.n); printf("Original message: %d\n", message); printf("Cipher text: %d\n", cipherText); printf("Decrypted message: %d\n", decryptedMessage); return 0; } ``` 运行程序,输出如下: ``` Original message: 123 Cipher text: 3483 Decrypted message: 123 ``` 以上代码仅作为示例,实际应用中需要考虑更多因素,如生成大素数的效率、密钥的保存和传输、padding等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值