BigInteger(简单了解)

BigInteger是java中比较好用的一个类,减少C语言中必须手动敲的麻烦,非常好用。BigInteger类包括以下几个函数,基本上这些函数的使用方法都类似,掌握一个基本上就掌握大多数了,但是偶尔几个需要注意。

基本函数包括:

1.valueOf(parament); 将参数转换为制定的类型

比如 int a=3;//valueOf()里面应该是只能整型;

BigInteger b=BigInteger.valueOf(a);

valueOf(long num);

则b=3;

2.add(); 大整数相加

BigInteger a=new BigInteger(“23”);

BigInteger b=new BigInteger(“34”);

a. add(b);

3.subtract(); 相减

4.multiply(); 相乘

5.divide(); 相除取整

6.remainder(); 取余

7.pow(); a.pow(b)=a^b//pow(int)如果里面不是int无法执行;

8.gcd(); 最大公约数

9.abs(); 绝对值

例如:sum = sum.abs();

10.negate(); 取反数

11.mod(); a.mod(b)=a%b=a.remainder(b);

12.max(); min();//取最大值最小值

13.punlic int comareTo();

14.boolean equals(); 是否相等

15.BigInteger构造函数:

以上函数的使用都类似于a.abs(b);

hdu1002

此题一直PE,无奈。

 import java.math.BigInteger;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        BigInteger a, b;
        int T;
        Scanner in = new Scanner(System.in);
        T = in.nextInt();
        for (int i = 1; i <= T; ++i) {
            System.out.println("Case" + " " + i + ":");
            a = in.nextBigInteger();
            b = in.nextBigInteger();
            if (i < T) {
                System.out.println(a + " + " + b + " = " + a.add(b) );
                System.out.println();
            } else {
                System.out.println(a + " + " + b + " = " + a.add(b));
            }
        }
    }
} 

参考资料:BigInteger详解 

链接:https://blog.csdn.net/qfikh/article/details/52832196

我理解到您需要一个代码实现来模拟zk-SNARK协议的过程。请注意,zk-SNARK是一种复杂的加密协议,需要深入的数学和计算机科学知识来理解和实现。在此,我将为您提供一个基本的实现框架,但这只是一个简化版本,没有进行实际的加密处理。 首先,让我们来了解一下zk-SNARK协议的基本流程: 1. 生成公私钥对 2. 生成证明 3. 验证证明 我们将按照这个流程来实现这个协议。 1. 生成公私钥对 我们首先需要一个密钥对,用于加密和解密。在zk-SNARK中,这个密钥对由一个大素数p和一个随机数g生成。我们可以使用Java的`java.util.Random`类来生成随机数,并使用`java.math.BigInteger`类来进行大数运算。 ```java import java.math.BigInteger; import java.util.Random; public class Zksnark { private BigInteger p, g, privateKey, publicKey; public Zksnark() { // Generate a random prime p and a random number g Random rand = new Random(); p = BigInteger.probablePrime(512, rand); g = new BigInteger(512, rand); // Generate a random private key and corresponding public key privateKey = new BigInteger(512, rand).mod(p); publicKey = g.modPow(privateKey, p); } public void printKeys() { System.out.println("Private key: " + privateKey.toString()); System.out.println("Public key: " + publicKey.toString()); } } ``` 2. 生成证明 下一步是生成证明。在zk-SNARK中,证明包含两个部分:一个公共部分和一个私有部分。公共部分可以由任何人验证,而私有部分只能由拥有私钥的人生成。我们将使用Java的`MessageDigest`类来生成哈希值,并使用`java.security.Signature`类来生成签名。 ```java import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Signature; import java.security.SignatureException; public class Zksnark { private BigInteger p, g, privateKey, publicKey; public Zksnark() { // ... } public void printKeys() { // ... } public String generateProof(String message) { // Generate a public hash of the message String publicHash = generateHash(message); // Sign the message using the private key byte[] signature = signMessage(publicHash); // Combine the public hash and signature to generate the proof return publicHash + ":" + new BigInteger(signature).toString(); } private String generateHash(String message) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] hash = md.digest(message.getBytes()); return new BigInteger(hash).toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } private byte[] signMessage(String message) { try { Signature sig = Signature.getInstance("SHA256withRSA"); sig.initSign(privateKey); sig.update(message.getBytes()); return sig.sign(); } catch (Exception e) { e.printStackTrace(); } return null; } } ``` 3. 验证证明 最后一步是验证证明。在zk-SNARK中,验证者可以通过公共证明来验证证明的正确性。我们将使用Java的`java.security.Signature`类来验证签名,并使用`java.math.BigInteger`类来进行大数运算。 ```java import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Signature; import java.security.SignatureException; import java.util.Arrays; public class Zksnark { private BigInteger p, g, privateKey, publicKey; public Zksnark() { // ... } public void printKeys() { // ... } public String generateProof(String message) { // ... } public boolean verifyProof(String proof, String message) { // Split the proof into public hash and signature String[] parts = proof.split(":"); String publicHash = parts[0]; byte[] signature = new BigInteger(parts[1]).toByteArray(); // Generate the public hash of the message String expectedHash = generateHash(message); // Verify the signature using the public key boolean signatureValid = verifySignature(signature, publicHash); // Verify that the public hash matches the expected hash boolean hashValid = publicHash.equals(expectedHash); // Return true if the signature and hash are both valid return signatureValid && hashValid; } private boolean verifySignature(byte[] signature, String message) { try { Signature sig = Signature.getInstance("SHA256withRSA"); sig.initVerify(publicKey); sig.update(message.getBytes()); return sig.verify(signature); } catch (Exception e) { e.printStackTrace(); } return false; } private String generateHash(String message) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] hash = md.digest(message.getBytes()); return new BigInteger(hash).toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } } ``` 这就是一个简单的zk-SNARK协议的Java实现。请注意,这只是一个基本的实现框架,没有进行实际的加密处理。如果您需要更高级的实现,请参考相关的文献和代码库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值