import math def duizhe(x): n=1 s=1 while pow(2,n)<x: n+=1 for i in(1,n): a=(x-2)/pow(2,i) if (a-int(a))==0: s=i return s x=int(input("请输入正方形个数:")) print("对折次数为",duizhe(x))把这个代码优化下
时间: 2023-11-12 09:06:36 浏览: 135
这段代码也可以进行一些优化:
1. 在for循环中使用了固定范围的range()函数,但是实际上只需要循环n次,可以使用range(n)来代替。
2. 在计算a的时候,每次循环都会重新计算,可以在外层循环之前计算一次。
3. 函数duizhe()的命名不太规范,可以改为duizhe_count()。
下面是优化后的代码:
```python
import math
def duizhe_count(x):
n = math.ceil(math.log2(x))
a = (x - 2) / pow(2, n)
for i in range(n):
if (a - int(a)) == 0:
return i + 1
a = (x - 2) / pow(2, i+1)
return n
x = int(input("请输入正方形个数:"))
print("对折次数为", duizhe_count(x))
```
优化后的代码使用了math模块中的log2()函数来计算n,使用了math.ceil()函数来向上取整,这样可以避免使用while循环。同时也将a的计算提到了外层循环之前,避免了重复计算。函数名duizhe_count()也更加规范了。
相关问题
将如下代码转成C#语言代码 import math def relatively_prime(a,b): # a > b while b != 0: temp = b b = a%b a = temp if a==1: return True else: return False def millerRabin(num): if num%2 ==0: return False flag = True Subsquare = 0 temp = num - 1 while True: temp = temp / 2 Subsquare += 1 if temp % 2 != 0: break b=[] # 存放所求整数(num)的原根 count = 0 for i in range(2,num-1):# g^(P-1) = 1 (mod P) if relatively_prime(num,i): b.append(i) count += 1 if count == 5: # 控制检测次数 break for i in b: two = 0 while True: if (i**temp)**(2**two)%num == 1 or (i**temp)**(2**two)%num == num-1: flag = True break else: two += 1 if two == Subsquare: flag = False break if flag == False: break # 如果存在一次不满足条件,则退出循环 return flag num = input(u"请输入要进行Miller-Rabin算法检测的数:") if millerRabin(num): print u"{0}大概率是素数".format(num) else: print u"{0}是合数 ".format(num)
using System;
namespace MillerRabin
{
class Program
{
static bool RelativelyPrime(int a, int b)
{
while (b != 0)
{
int temp = b;
b = a % b;
a = temp;
}
if (a == 1)
{
return true;
}
else
{
return false;
}
}
static bool MillerRabin(int num)
{
if (num % 2 == 0)
{
return false;
}
bool flag = true;
int subsquare = 0;
int temp = num - 1;
while (true)
{
temp = temp / 2;
subsquare += 1;
if (temp % 2 != 0)
{
break;
}
}
int[] b = new int[5]; // 存放所求整数(num)的原根
int count = 0;
for (int i = 2; i < num - 1; i++)
{
if (RelativelyPrime(num, i))
{
b[count] = i;
count += 1;
if (count == 5) // 控制检测次数
{
break;
}
}
}
for (int i = 0; i < 5; i++)
{
int two = 0;
while (true)
{
if (Math.Pow(b[i], temp * Math.Pow(2, two)) % num == 1 || Math.Pow(b[i], temp * Math.Pow(2, two)) % num == num - 1)
{
flag = true;
break;
}
else
{
two += 1;
if (two == subsquare)
{
flag = false;
break;
}
}
}
if (flag == false)
{
break; // 如果存在一次不满足条件,则退出循环
}
}
return flag;
}
static void Main(string[] args)
{
Console.WriteLine("请输入要进行Miller-Rabin算法检测的数:");
int num = Convert.ToInt32(Console.ReadLine());
if (MillerRabin(num))
{
Console.WriteLine("{0}大概率是素数", num);
}
else
{
Console.WriteLine("{0}是合数", num);
}
Console.ReadLine();
}
}
}
import random import math def is_prime(number): if number < 2: return False for i in range(2, int(number ** 0.5) + 1): if number % i == 0: return False return Truedef generate_key(length): while True: p = random.randint(2 ** (length//2 - 1), 2 ** (length//2)) if is_prime(p): break while True: q = random.randint(2 ** (length//2 - 1), 2 ** (length//2)) if is_prime(q) and q != p: break n = p * q phi_n = (p - 1) * (q - 1) while True: e = random.randint(2, phi_n - 1) if math.gcd(e, phi_n) == 1: break d = pow(e, -1, phi_n) public_key = (n, e) private_key = (n, d) return public_key, private_keydef encrypt(message, public_key): n, e = public_key m = int.from_bytes(message.encode(), 'big') c = pow(m, e, n) return c.to_bytes((c.bit_length() + 7) // 8, 'big') def decrypt(ciphertext, private_key): n, d = private_key c = int.from_bytes(ciphertext, 'big') m = pow(c, d, n) return m.to_bytes((m.bit_length() + 7) // 8, 'big') def main(): message = "Hello, this is a test message!" print("Original message:", message) public_key, private_key = generate_key(512) print("Public key:", public_key) print("Private key:", private_key) encrypted_message = encrypt(message, public_key) print("Encrypted message:", encrypted_message) decrypted_message = decrypt(encrypted_message, private_key) print("Decrypted message:", decrypted_message.decode()) if __name__ == "__main__": main()
这段代码实现了RSA加密算法的基本功能。首先定义了一个判断是否为质数的函数is_prime(),然后定义了一个生成公私密钥对的函数generate_key(),其中使用了随机数生成大素数,然后计算出公私密钥对。接着定义了加密函数encrypt()和解密函数decrypt(),分别使用公钥和私钥对消息进行加密和解密。最后在main()函数中调用这些函数,生成公私密钥对并使用公钥加密消息,再使用私钥解密消息,最终输出原始消息和解密后的消息。
阅读全文