| 1083 | |
| 1084 | #[test] |
| 1085 | fn computing_d() { |
| 1086 | // Test computing `d` where `d = (member_0 - element)*(member_1 - element)*...(member_n - element)` |
| 1087 | // where each `member_i` is an accumulator member. |
| 1088 | |
| 1089 | let mut rng = StdRng::seed_from_u64(0u64); |
| 1090 | |
| 1091 | // Check that `d` computed for a single element (non-member) when all members are available is |
| 1092 | // same as when `d` is computed over chunks of members and then multiplied |
| 1093 | let members: Vec<Fr> = (0..10).map(|_| Fr::rand(&mut rng)).collect(); |
| 1094 | let non_member = Fr::rand(&mut rng); |
| 1095 | |
| 1096 | let d = UniversalAccumulator::<G1Affine>::compute_d_given_members(&non_member, &members); |
| 1097 | |
| 1098 | let mut chunks = members.chunks(3); |
| 1099 | let d1 = UniversalAccumulator::<G1Affine>::compute_d_given_members( |
| 1100 | &non_member, |
| 1101 | chunks.next().unwrap(), |
| 1102 | ); |
| 1103 | let d2 = UniversalAccumulator::<G1Affine>::compute_d_given_members( |
| 1104 | &non_member, |
| 1105 | chunks.next().unwrap(), |
| 1106 | ); |
| 1107 | let d3 = UniversalAccumulator::<G1Affine>::compute_d_given_members( |
| 1108 | &non_member, |
| 1109 | chunks.next().unwrap(), |
| 1110 | ); |
| 1111 | let d4 = UniversalAccumulator::<G1Affine>::compute_d_given_members( |
| 1112 | &non_member, |
| 1113 | chunks.next().unwrap(), |
| 1114 | ); |
| 1115 | assert_eq!(d, d1 * d2 * d3 * d4); |
| 1116 | |
| 1117 | // Check that `d` computed for a batch of elements (non-members) when all members are available is |
| 1118 | // same as when `d` is computed over chunks of members and then multiplied |
| 1119 | let non_members = vec![Fr::rand(&mut rng), Fr::rand(&mut rng), Fr::rand(&mut rng)]; |
| 1120 | let d = UniversalAccumulator::<G1Affine>::compute_d_for_batch_given_members( |
| 1121 | &non_members, |
| 1122 | &members, |
| 1123 | ); |
| 1124 | |
| 1125 | let mut chunks = members.chunks(3); |
| 1126 | let d1 = UniversalAccumulator::<G1Affine>::compute_d_for_batch_given_members( |
| 1127 | &non_members, |
| 1128 | chunks.next().unwrap(), |
| 1129 | ); |
| 1130 | let d2 = UniversalAccumulator::<G1Affine>::compute_d_for_batch_given_members( |
| 1131 | &non_members, |
| 1132 | chunks.next().unwrap(), |
| 1133 | ); |
| 1134 | let d3 = UniversalAccumulator::<G1Affine>::compute_d_for_batch_given_members( |
| 1135 | &non_members, |
| 1136 | chunks.next().unwrap(), |
| 1137 | ); |
| 1138 | let d4 = UniversalAccumulator::<G1Affine>::compute_d_for_batch_given_members( |
| 1139 | &non_members, |
| 1140 | chunks.next().unwrap(), |
| 1141 | ); |
| 1142 | assert_eq!(d.len(), d1.len()); |