1use scirs2_core::ndarray::{Array1, Array2};
10use scirs2_core::Complex64;
11use scirs2_core::parallel_ops::*;
12use serde::{Deserialize, Serialize};
13use std::collections::HashMap;
14use std::f64::consts::PI;
15
16use crate::circuit_interfaces::{
17 CircuitInterface, InterfaceCircuit, InterfaceGate, InterfaceGateType,
18};
19use crate::error::{Result, SimulatorError};
20use crate::scirs2_integration::SciRS2Backend;
21use crate::scirs2_qft::{QFTConfig, QFTMethod, SciRS2QFT};
22use crate::statevector::StateVectorSimulator;
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq)]
26pub enum OptimizationLevel {
27 Basic,
29 Memory,
31 Speed,
33 Hardware,
35 Maximum,
37}
38
39#[derive(Debug, Clone)]
41pub struct QuantumAlgorithmConfig {
42 pub optimization_level: OptimizationLevel,
44 pub use_classical_preprocessing: bool,
46 pub enable_error_mitigation: bool,
48 pub max_circuit_depth: usize,
50 pub precision_tolerance: f64,
52 pub enable_parallel: bool,
54 pub resource_estimation_accuracy: f64,
56}
57
58impl Default for QuantumAlgorithmConfig {
59 fn default() -> Self {
60 Self {
61 optimization_level: OptimizationLevel::Maximum,
62 use_classical_preprocessing: true,
63 enable_error_mitigation: true,
64 max_circuit_depth: 1000,
65 precision_tolerance: 1e-10,
66 enable_parallel: true,
67 resource_estimation_accuracy: 0.95,
68 }
69 }
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct ShorResult {
75 pub n: u64,
77 pub factors: Vec<u64>,
79 pub period: Option<u64>,
81 pub quantum_iterations: usize,
83 pub execution_time_ms: f64,
85 pub classical_preprocessing_ms: f64,
87 pub quantum_computation_ms: f64,
89 pub success_probability: f64,
91 pub resource_stats: AlgorithmResourceStats,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct GroverResult {
98 pub found_items: Vec<usize>,
100 pub final_amplitudes: Vec<Complex64>,
102 pub iterations: usize,
104 pub optimal_iterations: usize,
106 pub success_probability: f64,
108 pub amplification_gain: f64,
110 pub execution_time_ms: f64,
112 pub resource_stats: AlgorithmResourceStats,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct PhaseEstimationResult {
119 pub eigenvalues: Vec<f64>,
121 pub precisions: Vec<f64>,
123 pub eigenvectors: Option<Array2<Complex64>>,
125 pub phase_qubits: usize,
127 pub precision_iterations: usize,
129 pub execution_time_ms: f64,
131 pub resource_stats: AlgorithmResourceStats,
133}
134
135#[derive(Debug, Clone, Default, Serialize, Deserialize)]
137pub struct AlgorithmResourceStats {
138 pub qubits_used: usize,
140 pub circuit_depth: usize,
142 pub gate_count: usize,
144 pub measurement_count: usize,
146 pub memory_usage_bytes: usize,
148 pub cnot_count: usize,
150 pub t_gate_count: usize,
152}
153
154pub struct OptimizedShorAlgorithm {
156 config: QuantumAlgorithmConfig,
158 backend: Option<SciRS2Backend>,
160 circuit_interface: CircuitInterface,
162 qft_engine: SciRS2QFT,
164}
165
166impl OptimizedShorAlgorithm {
167 pub fn new(config: QuantumAlgorithmConfig) -> Result<Self> {
169 let circuit_interface = CircuitInterface::new(Default::default())?;
170 let qft_config = QFTConfig {
171 method: QFTMethod::SciRS2Exact,
172 bit_reversal: true,
173 parallel: config.enable_parallel,
174 precision_threshold: config.precision_tolerance,
175 ..Default::default()
176 };
177 let qft_engine = SciRS2QFT::new(0, qft_config)?; Ok(Self {
180 config,
181 backend: None,
182 circuit_interface,
183 qft_engine,
184 })
185 }
186
187 pub fn with_backend(mut self) -> Result<Self> {
189 self.backend = Some(SciRS2Backend::new());
190 self.circuit_interface = self.circuit_interface.with_backend()?;
191 self.qft_engine = self.qft_engine.with_backend()?;
192 Ok(self)
193 }
194
195 pub fn factor(&mut self, n: u64) -> Result<ShorResult> {
197 let start_time = std::time::Instant::now();
198
199 let preprocessing_start = std::time::Instant::now();
201
202 if n <= 1 {
204 return Err(SimulatorError::InvalidInput(
205 "Cannot factor numbers <= 1".to_string(),
206 ));
207 }
208
209 if n == 2 {
210 return Ok(ShorResult {
211 n,
212 factors: vec![2],
213 period: None,
214 quantum_iterations: 0,
215 execution_time_ms: start_time.elapsed().as_secs_f64() * 1000.0,
216 classical_preprocessing_ms: 0.0,
217 quantum_computation_ms: 0.0,
218 success_probability: 1.0,
219 resource_stats: AlgorithmResourceStats::default(),
220 });
221 }
222
223 if n % 2 == 0 {
225 let factor = 2;
226 let other_factor = n / 2;
227 return Ok(ShorResult {
228 n,
229 factors: vec![factor, other_factor],
230 period: None,
231 quantum_iterations: 0,
232 execution_time_ms: start_time.elapsed().as_secs_f64() * 1000.0,
233 classical_preprocessing_ms: preprocessing_start.elapsed().as_secs_f64() * 1000.0,
234 quantum_computation_ms: 0.0,
235 success_probability: 1.0,
236 resource_stats: AlgorithmResourceStats::default(),
237 });
238 }
239
240 if let Some((base, _exponent)) = self.find_perfect_power(n) {
242 return Ok(ShorResult {
243 n,
244 factors: vec![base],
245 period: None,
246 quantum_iterations: 0,
247 execution_time_ms: start_time.elapsed().as_secs_f64() * 1000.0,
248 classical_preprocessing_ms: preprocessing_start.elapsed().as_secs_f64() * 1000.0,
249 quantum_computation_ms: 0.0,
250 success_probability: 1.0,
251 resource_stats: AlgorithmResourceStats::default(),
252 });
253 }
254
255 let classical_preprocessing_ms = preprocessing_start.elapsed().as_secs_f64() * 1000.0;
256
257 let quantum_start = std::time::Instant::now();
259 let mut quantum_iterations = 0;
260 let max_attempts = 10;
261
262 for attempt in 0..max_attempts {
263 quantum_iterations += 1;
264
265 let a = self.choose_random_base(n)?;
267
268 let gcd_val = self.gcd(a, n);
270 if gcd_val > 1 {
271 let other_factor = n / gcd_val;
272 return Ok(ShorResult {
273 n,
274 factors: vec![gcd_val, other_factor],
275 period: None,
276 quantum_iterations,
277 execution_time_ms: start_time.elapsed().as_secs_f64() * 1000.0,
278 classical_preprocessing_ms,
279 quantum_computation_ms: quantum_start.elapsed().as_secs_f64() * 1000.0,
280 success_probability: 1.0,
281 resource_stats: AlgorithmResourceStats::default(),
282 });
283 }
284
285 if let Some(period) = self.quantum_period_finding(a, n)? {
287 if self.verify_period(a, n, period) {
289 if let Some(factors) = self.extract_factors_from_period(a, n, period) {
291 let quantum_computation_ms = quantum_start.elapsed().as_secs_f64() * 1000.0;
292
293 let resource_stats = self.estimate_resources(n);
294
295 return Ok(ShorResult {
296 n,
297 factors,
298 period: Some(period),
299 quantum_iterations,
300 execution_time_ms: start_time.elapsed().as_secs_f64() * 1000.0,
301 classical_preprocessing_ms,
302 quantum_computation_ms,
303 success_probability: self
304 .estimate_success_probability(attempt, max_attempts),
305 resource_stats,
306 });
307 }
308 }
309 }
310 }
311
312 Ok(ShorResult {
314 n,
315 factors: vec![],
316 period: None,
317 quantum_iterations,
318 execution_time_ms: start_time.elapsed().as_secs_f64() * 1000.0,
319 classical_preprocessing_ms,
320 quantum_computation_ms: quantum_start.elapsed().as_secs_f64() * 1000.0,
321 success_probability: 0.0,
322 resource_stats: self.estimate_resources(n),
323 })
324 }
325
326 fn quantum_period_finding(&mut self, a: u64, n: u64) -> Result<Option<u64>> {
328 let n_bits = (n as f64).log2().ceil() as usize;
330 let register_size = 3 * n_bits; let total_qubits = register_size + n_bits;
332
333 let mut circuit = InterfaceCircuit::new(total_qubits, register_size);
335
336 for i in 0..register_size {
338 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Hadamard, vec![i]));
339 }
340
341 circuit.add_gate(InterfaceGate::new(
343 InterfaceGateType::PauliX,
344 vec![register_size],
345 ));
346
347 self.add_optimized_controlled_modular_exponentiation(&mut circuit, a, n, register_size)?;
349
350 self.add_inverse_qft(&mut circuit, register_size)?;
352
353 for i in 0..register_size {
355 circuit.add_gate(InterfaceGate::measurement(i, i));
356 }
357
358 let backend = crate::circuit_interfaces::SimulationBackend::StateVector;
360 let compiled = self.circuit_interface.compile_circuit(&circuit, backend)?;
361 let result = self.circuit_interface.execute_circuit(&compiled, None)?;
362
363 if !result.measurement_results.is_empty() {
365 let mut measured_value = 0usize;
367 for (i, &bit) in result
368 .measurement_results
369 .iter()
370 .take(register_size)
371 .enumerate()
372 {
373 if bit {
374 measured_value |= 1 << i;
375 }
376 }
377
378 if self.config.enable_error_mitigation {
380 measured_value = self.apply_error_mitigation(measured_value, register_size)?;
381 }
382
383 if let Some(period) =
385 self.extract_period_from_measurement_enhanced(measured_value, register_size, n)
386 {
387 return Ok(Some(period));
388 }
389 }
390
391 Ok(None)
392 }
393
394 fn add_optimized_controlled_modular_exponentiation(
396 &self,
397 circuit: &mut InterfaceCircuit,
398 a: u64,
399 n: u64,
400 register_size: usize,
401 ) -> Result<()> {
402 let n_bits = (n as f64).log2().ceil() as usize;
403
404 for i in 0..register_size {
405 let power = 1u64 << i;
406 let a_power_mod_n = self.mod_exp(a, power, n);
407
408 self.add_controlled_modular_multiplication_optimized(
410 circuit,
411 a_power_mod_n,
412 n,
413 i,
414 register_size,
415 n_bits,
416 )?;
417 }
418
419 Ok(())
420 }
421
422 fn add_controlled_modular_exponentiation(
424 &self,
425 circuit: &mut InterfaceCircuit,
426 a: u64,
427 n: u64,
428 register_size: usize,
429 ) -> Result<()> {
430 self.add_optimized_controlled_modular_exponentiation(circuit, a, n, register_size)
431 }
432
433 fn add_controlled_modular_multiplication_optimized(
435 &self,
436 circuit: &mut InterfaceCircuit,
437 multiplier: u64,
438 modulus: u64,
439 control_qubit: usize,
440 register_start: usize,
441 register_size: usize,
442 ) -> Result<()> {
443 let target_start = register_start + register_size;
445
446 let mont_multiplier = self.montgomery_form(multiplier, modulus);
448
449 for i in 0..register_size {
451 if (mont_multiplier >> i) & 1 == 1 {
452 self.add_controlled_quantum_adder(
454 circuit,
455 control_qubit,
456 register_start + i,
457 target_start + i,
458 register_size - i,
459 )?;
460 }
461 }
462
463 self.add_controlled_modular_reduction(
465 circuit,
466 modulus,
467 control_qubit,
468 target_start,
469 register_size,
470 )?;
471
472 Ok(())
473 }
474
475 fn add_controlled_modular_multiplication(
477 &self,
478 circuit: &mut InterfaceCircuit,
479 multiplier: u64,
480 modulus: u64,
481 control_qubit: usize,
482 register_start: usize,
483 register_size: usize,
484 ) -> Result<()> {
485 for i in 0..register_size {
489 if (multiplier >> i) & 1 == 1 {
490 circuit.add_gate(InterfaceGate::new(
492 InterfaceGateType::CNOT,
493 vec![control_qubit, register_start + i],
494 ));
495 }
496 }
497
498 Ok(())
499 }
500
501 fn add_inverse_qft(&mut self, circuit: &mut InterfaceCircuit, num_qubits: usize) -> Result<()> {
503 let qft_config = QFTConfig {
505 method: QFTMethod::SciRS2Exact,
506 bit_reversal: true,
507 parallel: self.config.enable_parallel,
508 precision_threshold: self.config.precision_tolerance,
509 ..Default::default()
510 };
511 self.qft_engine = SciRS2QFT::new(num_qubits, qft_config)?;
512
513 for i in 0..num_qubits {
515 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Hadamard, vec![i]));
516
517 for j in (i + 1)..num_qubits {
518 let angle = -PI / 2.0_f64.powi((j - i) as i32);
519 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Phase(angle), vec![j]));
520 circuit.add_gate(InterfaceGate::new(InterfaceGateType::CNOT, vec![i, j]));
521 circuit.add_gate(InterfaceGate::new(
522 InterfaceGateType::Phase(-angle),
523 vec![j],
524 ));
525 circuit.add_gate(InterfaceGate::new(InterfaceGateType::CNOT, vec![i, j]));
526 }
527 }
528
529 Ok(())
530 }
531
532 fn extract_period_from_measurement(
534 &self,
535 measured_value: usize,
536 register_size: usize,
537 n: u64,
538 ) -> Option<u64> {
539 if measured_value == 0 {
540 return None;
541 }
542
543 let max_register_value = 1 << register_size;
544 let fraction = measured_value as f64 / max_register_value as f64;
545
546 let convergents = self.continued_fractions(fraction, n);
548
549 for (num, den) in convergents {
550 if den > 0 && den < n {
551 return Some(den);
552 }
553 }
554
555 None
556 }
557
558 fn continued_fractions(&self, x: f64, max_denominator: u64) -> Vec<(u64, u64)> {
560 let mut convergents = Vec::new();
561 let mut a = x;
562 let mut p_prev = 0u64;
563 let mut p_curr = 1u64;
564 let mut q_prev = 1u64;
565 let mut q_curr = 0u64;
566
567 for _ in 0..20 {
568 let a_int = a.floor() as u64;
570 let p_next = a_int * p_curr + p_prev;
571 let q_next = a_int * q_curr + q_prev;
572
573 if q_next > max_denominator {
574 break;
575 }
576
577 convergents.push((p_next, q_next));
578
579 let remainder = a - a_int as f64;
580 if remainder.abs() < 1e-12 {
581 break;
582 }
583
584 a = 1.0 / remainder;
585 p_prev = p_curr;
586 p_curr = p_next;
587 q_prev = q_curr;
588 q_curr = q_next;
589 }
590
591 convergents
592 }
593
594 fn extract_period_from_measurement_enhanced(
596 &self,
597 measured_value: usize,
598 register_size: usize,
599 n: u64,
600 ) -> Option<u64> {
601 if measured_value == 0 {
602 return None;
603 }
604
605 let max_register_value = 1 << register_size;
606 let fraction = measured_value as f64 / max_register_value as f64;
607
608 let convergents = self.continued_fractions_enhanced(fraction, n);
610
611 for (num, den) in convergents {
613 if den > 0 && den < n {
614 if self.verify_period_enhanced(num, den, n) {
616 return Some(den);
617 }
618 }
619 }
620
621 None
622 }
623
624 fn continued_fractions_enhanced(&self, x: f64, max_denominator: u64) -> Vec<(u64, u64)> {
626 let mut convergents = Vec::new();
627 let mut a = x;
628 let mut p_prev = 0u64;
629 let mut p_curr = 1u64;
630 let mut q_prev = 1u64;
631 let mut q_curr = 0u64;
632
633 for _ in 0..50 {
635 let a_int = a.floor() as u64;
636 let p_next = a_int * p_curr + p_prev;
637 let q_next = a_int * q_curr + q_prev;
638
639 if q_next > max_denominator {
640 break;
641 }
642
643 convergents.push((p_next, q_next));
644
645 let remainder = a - a_int as f64;
646 if remainder.abs() < 1e-15 {
647 break;
649 }
650
651 a = 1.0 / remainder;
652 p_prev = p_curr;
653 p_curr = p_next;
654 q_prev = q_curr;
655 q_curr = q_next;
656 }
657
658 convergents
659 }
660
661 fn verify_period_enhanced(&self, _num: u64, period: u64, n: u64) -> bool {
663 if period == 0 || period >= n {
664 return false;
665 }
666
667 period > 1 && period % 2 == 0 && period < n / 2
669 }
670
671 fn apply_error_mitigation(&self, measured_value: usize, register_size: usize) -> Result<usize> {
673 let mut candidates = vec![measured_value];
675
676 if measured_value > 0 {
678 candidates.push(measured_value - 1);
679 }
680 if measured_value < (1 << register_size) - 1 {
681 candidates.push(measured_value + 1);
682 }
683
684 Ok(candidates[0])
686 }
687
688 fn montgomery_form(&self, value: u64, modulus: u64) -> u64 {
690 value % modulus
693 }
694
695 fn add_controlled_quantum_adder(
697 &self,
698 circuit: &mut InterfaceCircuit,
699 control_qubit: usize,
700 source_qubit: usize,
701 target_qubit: usize,
702 _width: usize,
703 ) -> Result<()> {
704 circuit.add_gate(InterfaceGate::new(
706 InterfaceGateType::CNOT,
707 vec![control_qubit, source_qubit],
708 ));
709 circuit.add_gate(InterfaceGate::new(
710 InterfaceGateType::CNOT,
711 vec![source_qubit, target_qubit],
712 ));
713 Ok(())
714 }
715
716 fn add_controlled_modular_reduction(
718 &self,
719 circuit: &mut InterfaceCircuit,
720 _modulus: u64,
721 control_qubit: usize,
722 register_start: usize,
723 register_size: usize,
724 ) -> Result<()> {
725 for i in 0..register_size {
727 circuit.add_gate(InterfaceGate::new(
728 InterfaceGateType::CPhase(PI / 4.0),
729 vec![control_qubit, register_start + i],
730 ));
731 }
732 Ok(())
733 }
734
735 fn find_perfect_power(&self, n: u64) -> Option<(u64, u32)> {
737 for exponent in 2..=((n as f64).log2().floor() as u32) {
738 let base = (n as f64).powf(1.0 / exponent as f64).round() as u64;
739 if base.pow(exponent) == n {
740 return Some((base, exponent));
741 }
742 }
743 None
744 }
745
746 fn choose_random_base(&self, n: u64) -> Result<u64> {
747 let candidates = [2, 3, 4, 5, 6, 7, 8];
749 for &a in &candidates {
750 if a < n && self.gcd(a, n) == 1 {
751 return Ok(a);
752 }
753 }
754
755 for a in 2..n {
757 if self.gcd(a, n) == 1 {
758 return Ok(a);
759 }
760 }
761
762 Err(SimulatorError::InvalidInput(
763 "Cannot find suitable base for factoring".to_string(),
764 ))
765 }
766
767 fn gcd(&self, mut a: u64, mut b: u64) -> u64 {
768 while b != 0 {
769 let temp = b;
770 b = a % b;
771 a = temp;
772 }
773 a
774 }
775
776 fn mod_exp(&self, base: u64, exp: u64, modulus: u64) -> u64 {
777 let mut result = 1u64;
778 let mut base = base % modulus;
779 let mut exp = exp;
780
781 while exp > 0 {
782 if exp % 2 == 1 {
783 result = (result * base) % modulus;
784 }
785 exp >>= 1;
786 base = (base * base) % modulus;
787 }
788
789 result
790 }
791
792 fn verify_period(&self, a: u64, n: u64, period: u64) -> bool {
793 if period == 0 {
794 return false;
795 }
796 self.mod_exp(a, period, n) == 1
797 }
798
799 fn extract_factors_from_period(&self, a: u64, n: u64, period: u64) -> Option<Vec<u64>> {
800 if period % 2 != 0 {
801 return None;
802 }
803
804 let half_period = period / 2;
805 let a_to_half = self.mod_exp(a, half_period, n);
806
807 if a_to_half == n - 1 {
808 return None; }
810
811 let factor1 = self.gcd(a_to_half - 1, n);
812 let factor2 = self.gcd(a_to_half + 1, n);
813
814 let mut factors = Vec::new();
815 if factor1 > 1 && factor1 < n {
816 factors.push(factor1);
817 factors.push(n / factor1);
818 } else if factor2 > 1 && factor2 < n {
819 factors.push(factor2);
820 factors.push(n / factor2);
821 }
822
823 if factors.is_empty() {
824 None
825 } else {
826 Some(factors)
827 }
828 }
829
830 fn estimate_success_probability(&self, attempt: usize, max_attempts: usize) -> f64 {
831 let base_probability = 0.5; 1.0f64 - (1.0f64 - base_probability).powi(attempt as i32 + 1)
834 }
835
836 fn estimate_resources(&self, n: u64) -> AlgorithmResourceStats {
837 let n_bits = (n as f64).log2().ceil() as usize;
838 let register_size = 2 * n_bits;
839 let total_qubits = register_size + n_bits;
840
841 let gate_count = total_qubits * total_qubits * 10; let cnot_count = gate_count / 3; let t_gate_count = gate_count / 10; let circuit_depth = total_qubits * 50; AlgorithmResourceStats {
848 qubits_used: total_qubits,
849 circuit_depth,
850 gate_count,
851 measurement_count: register_size,
852 memory_usage_bytes: (1 << total_qubits) * 16, cnot_count,
854 t_gate_count,
855 }
856 }
857}
858
859pub struct OptimizedGroverAlgorithm {
861 config: QuantumAlgorithmConfig,
863 backend: Option<SciRS2Backend>,
865 circuit_interface: CircuitInterface,
867}
868
869impl OptimizedGroverAlgorithm {
870 pub fn new(config: QuantumAlgorithmConfig) -> Result<Self> {
872 let circuit_interface = CircuitInterface::new(Default::default())?;
873
874 Ok(Self {
875 config,
876 backend: None,
877 circuit_interface,
878 })
879 }
880
881 pub fn with_backend(mut self) -> Result<Self> {
883 self.backend = Some(SciRS2Backend::new());
884 self.circuit_interface = self.circuit_interface.with_backend()?;
885 Ok(self)
886 }
887
888 pub fn search<F>(
890 &mut self,
891 num_qubits: usize,
892 oracle: F,
893 num_targets: usize,
894 ) -> Result<GroverResult>
895 where
896 F: Fn(usize) -> bool + Send + Sync,
897 {
898 let start_time = std::time::Instant::now();
899 let num_items = 1 << num_qubits;
900
901 if num_targets == 0 || num_targets >= num_items {
902 return Err(SimulatorError::InvalidInput(
903 "Invalid number of target items".to_string(),
904 ));
905 }
906
907 let optimal_iterations = self.calculate_optimal_iterations_enhanced(num_items, num_targets);
909
910 let mut circuit = InterfaceCircuit::new(num_qubits, num_qubits);
912
913 self.add_enhanced_superposition(&mut circuit, num_qubits)?;
915
916 for iteration in 0..optimal_iterations {
918 self.add_optimized_oracle(&mut circuit, &oracle, num_qubits, iteration)?;
920
921 self.add_enhanced_diffusion(&mut circuit, num_qubits, iteration, optimal_iterations)?;
923 }
924
925 if self.config.optimization_level == OptimizationLevel::Maximum {
927 self.add_pre_measurement_amplification(&mut circuit, &oracle, num_qubits)?;
928 }
929
930 for qubit in 0..num_qubits {
932 circuit.add_gate(InterfaceGate::measurement(qubit, qubit));
933 }
934
935 let backend = crate::circuit_interfaces::SimulationBackend::StateVector;
937 let compiled = self.circuit_interface.compile_circuit(&circuit, backend)?;
938 let result = self.circuit_interface.execute_circuit(&compiled, None)?;
939
940 let final_state = if let Some(state) = result.final_state {
942 state.to_vec()
943 } else {
944 let mut state = vec![Complex64::new(0.0, 0.0); 1 << num_qubits];
946 for i in 0..state.len() {
948 if oracle(i) {
949 state[i] = Complex64::new(1.0 / (num_targets as f64).sqrt(), 0.0);
950 } else {
951 let remaining_amp = (1.0 - num_targets as f64 / num_items as f64).sqrt()
952 / ((num_items - num_targets) as f64).sqrt();
953 state[i] = Complex64::new(remaining_amp, 0.0);
954 }
955 }
956 state
957 };
958 let probabilities: Vec<f64> = final_state.iter().map(|amp| amp.norm_sqr()).collect();
959
960 let mut items_with_probs: Vec<(usize, f64)> = probabilities
962 .iter()
963 .enumerate()
964 .map(|(i, &p)| (i, p))
965 .collect();
966 items_with_probs.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());
967
968 let found_items: Vec<usize> = items_with_probs
969 .iter()
970 .take(num_targets)
971 .filter(|(item, prob)| oracle(*item) && *prob > 1.0 / num_items as f64)
972 .map(|(item, _)| *item)
973 .collect();
974
975 let success_probability = found_items
976 .iter()
977 .map(|&item| probabilities[item])
978 .sum::<f64>();
979
980 let amplification_gain = success_probability / (num_targets as f64 / num_items as f64);
981
982 let resource_stats = AlgorithmResourceStats {
983 qubits_used: num_qubits,
984 circuit_depth: optimal_iterations * (num_qubits * 3 + 10), gate_count: optimal_iterations * (num_qubits * 5 + 20), measurement_count: num_qubits,
987 memory_usage_bytes: (1 << num_qubits) * 16,
988 cnot_count: optimal_iterations * num_qubits,
989 t_gate_count: optimal_iterations * 2,
990 };
991
992 Ok(GroverResult {
993 found_items,
994 final_amplitudes: final_state.to_vec(),
995 iterations: optimal_iterations,
996 optimal_iterations,
997 success_probability,
998 amplification_gain,
999 execution_time_ms: start_time.elapsed().as_secs_f64() * 1000.0,
1000 resource_stats,
1001 })
1002 }
1003
1004 fn calculate_optimal_iterations_enhanced(&self, num_items: usize, num_targets: usize) -> usize {
1006 let theta = (num_targets as f64 / num_items as f64).sqrt().asin();
1007 let optimal = (PI / (4.0 * theta) - 0.5).round() as usize;
1008
1009 match self.config.optimization_level {
1011 OptimizationLevel::Maximum => {
1012 let corrected = (optimal as f64 * 1.05).round() as usize; corrected.max(1).min(num_items / 2)
1015 }
1016 OptimizationLevel::Speed => {
1017 (optimal * 9 / 10).max(1)
1019 }
1020 _ => optimal.max(1),
1021 }
1022 }
1023
1024 fn calculate_optimal_iterations(&self, num_items: usize, num_targets: usize) -> usize {
1026 self.calculate_optimal_iterations_enhanced(num_items, num_targets)
1027 }
1028
1029 fn add_enhanced_superposition(
1031 &self,
1032 circuit: &mut InterfaceCircuit,
1033 num_qubits: usize,
1034 ) -> Result<()> {
1035 for qubit in 0..num_qubits {
1037 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Hadamard, vec![qubit]));
1038 }
1039
1040 if self.config.optimization_level == OptimizationLevel::Maximum {
1042 let enhancement_angle = PI / (8.0 * num_qubits as f64);
1043 for qubit in 0..num_qubits {
1044 circuit.add_gate(InterfaceGate::new(
1045 InterfaceGateType::RY(enhancement_angle),
1046 vec![qubit],
1047 ));
1048 }
1049 }
1050
1051 Ok(())
1052 }
1053
1054 fn add_optimized_oracle<F>(
1056 &self,
1057 circuit: &mut InterfaceCircuit,
1058 oracle: &F,
1059 num_qubits: usize,
1060 iteration: usize,
1061 ) -> Result<()>
1062 where
1063 F: Fn(usize) -> bool + Send + Sync,
1064 {
1065 self.add_oracle_to_circuit(circuit, oracle, num_qubits)?;
1067
1068 if self.config.optimization_level == OptimizationLevel::Maximum && iteration > 0 {
1070 let correction_angle = PI / (2.0 * (iteration + 1) as f64);
1071 circuit.add_gate(InterfaceGate::new(
1072 InterfaceGateType::Phase(correction_angle),
1073 vec![0], ));
1075 }
1076
1077 Ok(())
1078 }
1079
1080 fn add_enhanced_diffusion(
1082 &self,
1083 circuit: &mut InterfaceCircuit,
1084 num_qubits: usize,
1085 iteration: usize,
1086 total_iterations: usize,
1087 ) -> Result<()> {
1088 self.add_diffusion_to_circuit(circuit, num_qubits)?;
1090
1091 if self.config.optimization_level == OptimizationLevel::Maximum {
1093 let progress = iteration as f64 / total_iterations as f64;
1094 let amplification_angle = PI * 0.1 * (1.0 - progress); for qubit in 0..num_qubits {
1097 circuit.add_gate(InterfaceGate::new(
1098 InterfaceGateType::RZ(amplification_angle),
1099 vec![qubit],
1100 ));
1101 }
1102 }
1103
1104 Ok(())
1105 }
1106
1107 fn add_pre_measurement_amplification<F>(
1109 &self,
1110 circuit: &mut InterfaceCircuit,
1111 oracle: &F,
1112 num_qubits: usize,
1113 ) -> Result<()>
1114 where
1115 F: Fn(usize) -> bool + Send + Sync,
1116 {
1117 let final_angle = PI / (4.0 * num_qubits as f64);
1119
1120 for qubit in 0..num_qubits {
1121 circuit.add_gate(InterfaceGate::new(
1122 InterfaceGateType::RY(final_angle),
1123 vec![qubit],
1124 ));
1125 }
1126
1127 for state in 0..(1 << num_qubits) {
1129 if oracle(state) {
1130 circuit.add_gate(InterfaceGate::new(
1132 InterfaceGateType::Phase(PI / 8.0),
1133 vec![0], ));
1135 break; }
1137 }
1138
1139 Ok(())
1140 }
1141
1142 fn apply_oracle_phase<F>(
1144 &self,
1145 simulator: &mut StateVectorSimulator,
1146 oracle: &F,
1147 num_qubits: usize,
1148 ) -> Result<()>
1149 where
1150 F: Fn(usize) -> bool + Send + Sync,
1151 {
1152 let mut state = simulator.get_state();
1154
1155 for (index, amplitude) in state.iter_mut().enumerate() {
1156 if oracle(index) {
1157 *amplitude = -*amplitude;
1158 }
1159 }
1160
1161 simulator.set_state(state)?;
1162 Ok(())
1163 }
1164
1165 fn add_oracle_to_circuit<F>(
1167 &self,
1168 circuit: &mut InterfaceCircuit,
1169 oracle: &F,
1170 num_qubits: usize,
1171 ) -> Result<()>
1172 where
1173 F: Fn(usize) -> bool + Send + Sync,
1174 {
1175 for state in 0..(1 << num_qubits) {
1177 if oracle(state) {
1178 let mut control_qubits = Vec::new();
1180 let target_qubit = num_qubits - 1; for qubit in 0..num_qubits {
1183 if qubit == target_qubit {
1184 continue; }
1186
1187 if (state >> qubit) & 1 == 0 {
1188 circuit
1190 .add_gate(InterfaceGate::new(InterfaceGateType::PauliX, vec![qubit]));
1191 }
1192 control_qubits.push(qubit);
1193 }
1194
1195 if !control_qubits.is_empty() {
1197 let mut qubits = control_qubits.clone();
1198 qubits.push(target_qubit);
1199 circuit.add_gate(InterfaceGate::new(
1200 InterfaceGateType::MultiControlledZ(control_qubits.len()),
1201 qubits,
1202 ));
1203 } else {
1204 circuit.add_gate(InterfaceGate::new(
1206 InterfaceGateType::PauliZ,
1207 vec![target_qubit],
1208 ));
1209 }
1210
1211 for qubit in 0..num_qubits {
1213 if qubit != target_qubit && (state >> qubit) & 1 == 0 {
1214 circuit
1215 .add_gate(InterfaceGate::new(InterfaceGateType::PauliX, vec![qubit]));
1216 }
1217 }
1218 }
1219 }
1220 Ok(())
1221 }
1222
1223 fn add_diffusion_to_circuit(
1225 &self,
1226 circuit: &mut InterfaceCircuit,
1227 num_qubits: usize,
1228 ) -> Result<()> {
1229 for qubit in 0..num_qubits {
1233 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Hadamard, vec![qubit]));
1234 }
1235
1236 if num_qubits > 1 {
1238 let mut control_qubits: Vec<usize> = (1..num_qubits).collect();
1239 control_qubits.push(0); circuit.add_gate(InterfaceGate::new(
1241 InterfaceGateType::MultiControlledZ(num_qubits - 1),
1242 control_qubits,
1243 ));
1244 } else {
1245 circuit.add_gate(InterfaceGate::new(InterfaceGateType::PauliZ, vec![0]));
1246 }
1247
1248 for qubit in 0..num_qubits {
1250 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Hadamard, vec![qubit]));
1251 }
1252
1253 Ok(())
1254 }
1255
1256 fn apply_diffusion_operator(
1258 &self,
1259 simulator: &mut StateVectorSimulator,
1260 num_qubits: usize,
1261 ) -> Result<()> {
1262 for qubit in 0..num_qubits {
1266 simulator.apply_h(qubit)?;
1267 }
1268
1269 let mut state = simulator.get_state();
1271 state[0] = -state[0];
1272 simulator.set_state(state)?;
1273
1274 for qubit in 0..num_qubits {
1276 simulator.apply_h(qubit)?;
1277 }
1278
1279 Ok(())
1280 }
1281}
1282
1283pub struct EnhancedPhaseEstimation {
1285 config: QuantumAlgorithmConfig,
1287 backend: Option<SciRS2Backend>,
1289 circuit_interface: CircuitInterface,
1291 qft_engine: SciRS2QFT,
1293}
1294
1295impl EnhancedPhaseEstimation {
1296 pub fn new(config: QuantumAlgorithmConfig) -> Result<Self> {
1298 let circuit_interface = CircuitInterface::new(Default::default())?;
1299 let qft_config = QFTConfig {
1300 method: QFTMethod::SciRS2Exact,
1301 bit_reversal: true,
1302 parallel: config.enable_parallel,
1303 precision_threshold: config.precision_tolerance,
1304 ..Default::default()
1305 };
1306 let qft_engine = SciRS2QFT::new(0, qft_config)?;
1307
1308 Ok(Self {
1309 config,
1310 backend: None,
1311 circuit_interface,
1312 qft_engine,
1313 })
1314 }
1315
1316 pub fn with_backend(mut self) -> Result<Self> {
1318 self.backend = Some(SciRS2Backend::new());
1319 self.circuit_interface = self.circuit_interface.with_backend()?;
1320 self.qft_engine = self.qft_engine.with_backend()?;
1321 Ok(self)
1322 }
1323
1324 pub fn estimate_eigenvalues<U>(
1326 &mut self,
1327 unitary_operator: U,
1328 eigenstate: &Array1<Complex64>,
1329 target_precision: f64,
1330 ) -> Result<PhaseEstimationResult>
1331 where
1332 U: Fn(&mut StateVectorSimulator, usize) -> Result<()> + Send + Sync,
1333 {
1334 let start_time = std::time::Instant::now();
1335
1336 let mut phase_qubits = self.calculate_required_phase_qubits(target_precision);
1338 let system_qubits = (eigenstate.len() as f64).log2().ceil() as usize;
1339 let mut total_qubits = phase_qubits + system_qubits;
1340
1341 let mut best_precision = f64::INFINITY;
1342 let mut best_eigenvalues = Vec::new();
1343 let mut best_eigenvectors: Option<Array2<Complex64>> = None;
1344 let mut precision_iterations = 0;
1345
1346 let max_iterations = match self.config.optimization_level {
1348 OptimizationLevel::Maximum => 20,
1349 OptimizationLevel::Hardware => 15,
1350 _ => 10,
1351 };
1352
1353 for iteration in 0..max_iterations {
1354 precision_iterations += 1;
1355
1356 let iteration_result = self.run_enhanced_phase_estimation_iteration(
1358 &unitary_operator,
1359 eigenstate,
1360 phase_qubits,
1361 system_qubits,
1362 iteration,
1363 )?;
1364
1365 let achieved_precision = 1.0 / (1 << phase_qubits) as f64;
1367
1368 if achieved_precision < best_precision {
1369 best_precision = achieved_precision;
1370 best_eigenvalues = iteration_result.eigenvalues;
1371 best_eigenvectors = iteration_result.eigenvectors;
1372 }
1373
1374 if achieved_precision <= target_precision {
1376 break;
1377 }
1378
1379 if iteration < max_iterations - 1 {
1381 phase_qubits =
1382 self.adapt_phase_qubits(phase_qubits, achieved_precision, target_precision);
1383 total_qubits = phase_qubits + system_qubits;
1384
1385 let qft_config = crate::scirs2_qft::QFTConfig {
1387 method: crate::scirs2_qft::QFTMethod::SciRS2Exact,
1388 bit_reversal: true,
1389 parallel: self.config.enable_parallel,
1390 precision_threshold: self.config.precision_tolerance,
1391 ..Default::default()
1392 };
1393 self.qft_engine = crate::scirs2_qft::SciRS2QFT::new(phase_qubits, qft_config)?;
1394 }
1395 }
1396
1397 let resource_stats =
1399 self.estimate_qpe_resources(phase_qubits, system_qubits, precision_iterations);
1400
1401 Ok(PhaseEstimationResult {
1402 eigenvalues: best_eigenvalues,
1403 precisions: vec![best_precision],
1404 eigenvectors: best_eigenvectors,
1405 phase_qubits,
1406 precision_iterations,
1407 execution_time_ms: start_time.elapsed().as_secs_f64() * 1000.0,
1408 resource_stats,
1409 })
1410 }
1411
1412 fn run_phase_estimation_iteration<U>(
1414 &mut self,
1415 unitary_operator: &U,
1416 eigenstate: &Array1<Complex64>,
1417 phase_qubits: usize,
1418 system_qubits: usize,
1419 ) -> Result<f64>
1420 where
1421 U: Fn(&mut StateVectorSimulator, usize) -> Result<()> + Send + Sync,
1422 {
1423 let total_qubits = phase_qubits + system_qubits;
1424 let mut simulator = StateVectorSimulator::new();
1425
1426 simulator.initialize_state(phase_qubits + system_qubits)?;
1431
1432 for qubit in system_qubits..(system_qubits + phase_qubits) {
1434 simulator.apply_h(qubit)?;
1435 }
1436
1437 for i in 0..system_qubits {
1439 if i < eigenstate.len() && eigenstate[i].norm_sqr() > 0.5 {
1440 simulator.apply_x(i)?;
1441 }
1442 }
1443
1444 for (i, control_qubit) in (system_qubits..(system_qubits + phase_qubits)).enumerate() {
1446 let power = 1 << i;
1447
1448 for _ in 0..power {
1450 for target_qubit in 0..system_qubits {
1452 unitary_operator(&mut simulator, target_qubit)?;
1455 }
1456 }
1457 }
1458
1459 let mut state_vec = simulator.get_state_mut();
1462 let mut state_array = Array1::from_vec(state_vec);
1463 self.qft_engine.apply_inverse_qft(&mut state_array)?;
1464
1465 let new_state = state_array.to_vec();
1467 simulator.set_state(new_state)?;
1468
1469 let amplitudes = simulator.get_state();
1471 let mut max_prob = 0.0;
1472 let mut best_measurement = 0;
1473
1474 for (state_index, amplitude) in amplitudes.iter().enumerate() {
1475 let phase_measurement = (state_index >> system_qubits) & ((1 << phase_qubits) - 1);
1476 let prob = amplitude.norm_sqr();
1477
1478 if prob > max_prob {
1479 max_prob = prob;
1480 best_measurement = phase_measurement;
1481 }
1482 }
1483
1484 let eigenvalue =
1486 best_measurement as f64 / (1 << phase_qubits) as f64 * 2.0 * std::f64::consts::PI;
1487 Ok(eigenvalue)
1488 }
1489
1490 fn calculate_required_phase_qubits(&self, target_precision: f64) -> usize {
1492 let base_qubits = (-target_precision.log2()).ceil() as usize + 2;
1493
1494 match self.config.optimization_level {
1496 OptimizationLevel::Maximum => {
1497 (base_qubits as f64 * 1.5).ceil() as usize
1499 }
1500 OptimizationLevel::Memory => {
1501 (base_qubits * 3 / 4).max(3)
1503 }
1504 _ => base_qubits,
1505 }
1506 }
1507
1508 fn adapt_phase_qubits(
1510 &self,
1511 current_qubits: usize,
1512 achieved_precision: f64,
1513 target_precision: f64,
1514 ) -> usize {
1515 if achieved_precision > target_precision * 2.0 {
1516 (current_qubits + 2).min(30) } else if achieved_precision < target_precision * 0.5 {
1519 (current_qubits - 1).max(3)
1521 } else {
1522 current_qubits
1523 }
1524 }
1525}
1526
1527struct QPEIterationResult {
1529 eigenvalues: Vec<f64>,
1530 eigenvectors: Option<Array2<Complex64>>,
1531 measurement_probabilities: Vec<f64>,
1532}
1533
1534impl EnhancedPhaseEstimation {
1535 fn run_enhanced_phase_estimation_iteration<U>(
1537 &mut self,
1538 unitary_operator: &U,
1539 eigenstate: &Array1<Complex64>,
1540 phase_qubits: usize,
1541 system_qubits: usize,
1542 iteration: usize,
1543 ) -> Result<QPEIterationResult>
1544 where
1545 U: Fn(&mut StateVectorSimulator, usize) -> Result<()> + Send + Sync,
1546 {
1547 let total_qubits = phase_qubits + system_qubits;
1548 let mut simulator = StateVectorSimulator::new();
1549
1550 simulator.initialize_state(total_qubits)?;
1552
1553 for qubit in system_qubits..(system_qubits + phase_qubits) {
1555 simulator.apply_h(qubit)?;
1556
1557 if self.config.optimization_level == OptimizationLevel::Maximum && iteration > 0 {
1559 let _correction_angle = PI / (4.0 * (iteration + 1) as f64);
1560 }
1563 }
1564
1565 self.prepare_enhanced_eigenstate(&mut simulator, eigenstate, system_qubits)?;
1567
1568 for (i, control_qubit) in (system_qubits..(system_qubits + phase_qubits)).enumerate() {
1570 let power = 1 << i;
1571
1572 for _ in 0..power {
1574 for target_qubit in 0..system_qubits {
1575 self.apply_enhanced_controlled_unitary(
1577 &mut simulator,
1578 unitary_operator,
1579 control_qubit,
1580 target_qubit,
1581 iteration,
1582 )?;
1583 }
1584 }
1585 }
1586
1587 self.apply_enhanced_inverse_qft(&mut simulator, system_qubits, phase_qubits)?;
1589
1590 let amplitudes = simulator.get_state();
1592 let eigenvalues =
1593 self.extract_enhanced_eigenvalues(&litudes, phase_qubits, system_qubits)?;
1594 let measurement_probs = self.calculate_measurement_probabilities(&litudes, phase_qubits);
1595
1596 let eigenvectors = if self.config.optimization_level == OptimizationLevel::Maximum {
1598 Some(self.extract_eigenvectors(&litudes, system_qubits)?)
1599 } else {
1600 None
1601 };
1602
1603 Ok(QPEIterationResult {
1604 eigenvalues,
1605 eigenvectors,
1606 measurement_probabilities: measurement_probs,
1607 })
1608 }
1609
1610 fn prepare_enhanced_eigenstate(
1612 &self,
1613 simulator: &mut StateVectorSimulator,
1614 eigenstate: &Array1<Complex64>,
1615 system_qubits: usize,
1616 ) -> Result<()> {
1617 for i in 0..system_qubits.min(eigenstate.len()) {
1619 let amplitude = eigenstate[i];
1620 let probability = amplitude.norm_sqr();
1621
1622 if probability > 0.5 {
1624 simulator.apply_x(i)?;
1625
1626 if amplitude.arg().abs() > 1e-10 {
1628 }
1630 } else if probability > 0.25 {
1631 let _theta = 2.0 * probability.sqrt().acos();
1633 if amplitude.arg().abs() > 1e-10 {
1636 }
1638 }
1639 }
1640
1641 Ok(())
1642 }
1643
1644 fn apply_enhanced_controlled_unitary<U>(
1646 &self,
1647 simulator: &mut StateVectorSimulator,
1648 unitary_operator: &U,
1649 control_qubit: usize,
1650 target_qubit: usize,
1651 iteration: usize,
1652 ) -> Result<()>
1653 where
1654 U: Fn(&mut StateVectorSimulator, usize) -> Result<()> + Send + Sync,
1655 {
1656 unitary_operator(simulator, target_qubit)?;
1659
1660 if self.config.enable_error_mitigation && iteration > 0 {
1662 let _mitigation_angle = PI / (16.0 * (iteration + 1) as f64);
1663 }
1665
1666 Ok(())
1667 }
1668
1669 fn apply_enhanced_inverse_qft(
1671 &mut self,
1672 simulator: &mut StateVectorSimulator,
1673 system_qubits: usize,
1674 phase_qubits: usize,
1675 ) -> Result<()> {
1676 let mut state = Array1::from_vec(simulator.get_state());
1678
1679 let phase_start = system_qubits;
1681 let phase_end = system_qubits + phase_qubits;
1682
1683 let state_size = 1 << phase_qubits;
1685 let mut phase_state = Array1::zeros(state_size);
1686
1687 for i in 0..state_size {
1688 let full_index = i << system_qubits; if full_index < state.len() {
1690 phase_state[i] = state[full_index];
1691 }
1692 }
1693
1694 self.qft_engine.apply_inverse_qft(&mut phase_state)?;
1696
1697 for i in 0..state_size {
1699 let full_index = i << system_qubits;
1700 if full_index < state.len() {
1701 state[full_index] = phase_state[i];
1702 }
1703 }
1704
1705 simulator.set_state(state.to_vec())?;
1707
1708 Ok(())
1709 }
1710
1711 fn extract_enhanced_eigenvalues(
1713 &self,
1714 amplitudes: &[Complex64],
1715 phase_qubits: usize,
1716 system_qubits: usize,
1717 ) -> Result<Vec<f64>> {
1718 let mut eigenvalues = Vec::new();
1719 let phase_states = 1 << phase_qubits;
1720
1721 let mut max_prob = 0.0;
1723 let mut best_measurement = 0;
1724
1725 for phase_val in 0..phase_states {
1726 let mut total_prob = 0.0;
1727
1728 for sys_val in 0..(1 << system_qubits) {
1730 let full_index = phase_val << system_qubits | sys_val;
1731 if full_index < amplitudes.len() {
1732 total_prob += amplitudes[full_index].norm_sqr();
1733 }
1734 }
1735
1736 if total_prob > max_prob {
1737 max_prob = total_prob;
1738 best_measurement = phase_val;
1739 }
1740 }
1741
1742 let eigenvalue = best_measurement as f64 / phase_states as f64 * 2.0 * PI;
1744 eigenvalues.push(eigenvalue);
1745
1746 if self.config.optimization_level == OptimizationLevel::Maximum {
1748 for phase_val in 0..phase_states {
1750 if phase_val == best_measurement {
1751 continue;
1752 }
1753
1754 let mut total_prob = 0.0;
1755 for sys_val in 0..(1 << system_qubits) {
1756 let full_index = phase_val << system_qubits | sys_val;
1757 if full_index < amplitudes.len() {
1758 total_prob += amplitudes[full_index].norm_sqr();
1759 }
1760 }
1761
1762 if total_prob > max_prob * 0.1 {
1764 let secondary_eigenvalue = phase_val as f64 / phase_states as f64 * 2.0 * PI;
1765 eigenvalues.push(secondary_eigenvalue);
1766 }
1767 }
1768 }
1769
1770 Ok(eigenvalues)
1771 }
1772
1773 fn calculate_measurement_probabilities(
1775 &self,
1776 amplitudes: &[Complex64],
1777 phase_qubits: usize,
1778 ) -> Vec<f64> {
1779 let phase_states = 1 << phase_qubits;
1780 let mut probabilities = vec![0.0; phase_states];
1781
1782 for (i, amplitude) in amplitudes.iter().enumerate() {
1783 let trailing_zeros = amplitudes.len().trailing_zeros();
1784 let phase_qubits_u32 = phase_qubits as u32;
1785
1786 let phase_val = if trailing_zeros >= phase_qubits_u32 {
1787 i >> (trailing_zeros - phase_qubits_u32)
1788 } else {
1789 i << (phase_qubits_u32 - trailing_zeros)
1790 };
1791
1792 if phase_val < phase_states {
1793 probabilities[phase_val] += amplitude.norm_sqr();
1794 }
1795 }
1796
1797 probabilities
1798 }
1799
1800 fn extract_eigenvectors(
1802 &self,
1803 amplitudes: &[Complex64],
1804 system_qubits: usize,
1805 ) -> Result<Array2<Complex64>> {
1806 let system_states = 1 << system_qubits;
1807 let mut eigenvectors = Array2::zeros((system_states, 1));
1808
1809 for i in 0..system_states.min(amplitudes.len()) {
1811 eigenvectors[[i, 0]] = amplitudes[i];
1812 }
1813
1814 Ok(eigenvectors)
1815 }
1816
1817 fn estimate_qpe_resources(
1819 &self,
1820 phase_qubits: usize,
1821 system_qubits: usize,
1822 iterations: usize,
1823 ) -> AlgorithmResourceStats {
1824 let total_qubits = phase_qubits + system_qubits;
1825
1826 let controlled_operations = phase_qubits * system_qubits * iterations;
1828 let qft_gates = phase_qubits * phase_qubits / 2; let base_gate_count = controlled_operations * 10 + qft_gates * 5;
1830
1831 AlgorithmResourceStats {
1832 qubits_used: total_qubits,
1833 circuit_depth: phase_qubits * 50 * iterations, gate_count: base_gate_count,
1835 measurement_count: phase_qubits,
1836 memory_usage_bytes: (1 << total_qubits) * 16,
1837 cnot_count: controlled_operations,
1838 t_gate_count: qft_gates / 2, }
1840 }
1841
1842 fn apply_controlled_modular_exp(
1844 &self,
1845 simulator: &mut StateVectorSimulator,
1846 control_qubit: usize,
1847 target_range: std::ops::Range<usize>,
1848 base: u64,
1849 power: usize,
1850 modulus: u64,
1851 ) -> Result<()> {
1852 let mut exp_base = base;
1854 for _ in 0..power {
1855 exp_base = (exp_base * exp_base) % modulus;
1856 }
1857
1858 let num_targets = target_range.len();
1861
1862 for x in 0..(1 << num_targets) {
1864 if x < modulus as usize {
1865 let result = ((x as u64 * exp_base) % modulus) as usize;
1866
1867 if x != result {
1869 for i in 0..num_targets {
1871 let x_bit = (x >> i) & 1;
1872 let result_bit = (result >> i) & 1;
1873
1874 if x_bit != result_bit {
1875 let target_qubit = target_range.start + i;
1877 simulator.apply_cnot_public(control_qubit, target_qubit)?;
1878 }
1879 }
1880 }
1881 }
1882 }
1883
1884 Ok(())
1885 }
1886}
1887
1888pub fn benchmark_quantum_algorithms() -> Result<HashMap<String, f64>> {
1890 let mut results = HashMap::new();
1891
1892 let shor_start = std::time::Instant::now();
1894 let config = QuantumAlgorithmConfig::default();
1895 let mut shor = OptimizedShorAlgorithm::new(config)?;
1896 let _shor_result = shor.factor(15)?; results.insert(
1898 "shor_15".to_string(),
1899 shor_start.elapsed().as_secs_f64() * 1000.0,
1900 );
1901
1902 let grover_start = std::time::Instant::now();
1904 let config = QuantumAlgorithmConfig::default();
1905 let mut grover = OptimizedGroverAlgorithm::new(config)?;
1906 let oracle = |x: usize| x == 5 || x == 10; let _grover_result = grover.search(4, oracle, 2)?;
1908 results.insert(
1909 "grover_4qubits".to_string(),
1910 grover_start.elapsed().as_secs_f64() * 1000.0,
1911 );
1912
1913 let qpe_start = std::time::Instant::now();
1915 let config = QuantumAlgorithmConfig::default();
1916 let mut qpe = EnhancedPhaseEstimation::new(config)?;
1917 let eigenstate = Array1::from_vec(vec![Complex64::new(1.0, 0.0), Complex64::new(0.0, 0.0)]);
1918 let unitary = |sim: &mut StateVectorSimulator, target_qubit: usize| -> Result<()> {
1919 sim.apply_z_public(target_qubit)?;
1921 Ok(())
1922 };
1923 let _qpe_result = qpe.estimate_eigenvalues(unitary, &eigenstate, 1e-3)?;
1924 results.insert(
1925 "phase_estimation".to_string(),
1926 qpe_start.elapsed().as_secs_f64() * 1000.0,
1927 );
1928
1929 Ok(results)
1930}
1931
1932#[cfg(test)]
1933mod tests {
1934 use super::*;
1935
1936 #[test]
1937 fn test_shor_algorithm_creation() {
1938 let config = QuantumAlgorithmConfig::default();
1939 let shor = OptimizedShorAlgorithm::new(config);
1940 assert!(shor.is_ok());
1941 }
1942
1943 #[test]
1944 fn test_shor_trivial_cases() {
1945 let config = QuantumAlgorithmConfig::default();
1946 let mut shor = OptimizedShorAlgorithm::new(config).unwrap();
1947
1948 let result = shor.factor(14).unwrap();
1950 assert!(result.factors.contains(&2));
1951 assert!(result.factors.contains(&7));
1952
1953 }
1955
1956 #[test]
1957 fn test_grover_algorithm_creation() {
1958 let config = QuantumAlgorithmConfig::default();
1959 let grover = OptimizedGroverAlgorithm::new(config);
1960 assert!(grover.is_ok());
1961 }
1962
1963 #[test]
1964 fn test_grover_optimal_iterations() {
1965 let config = QuantumAlgorithmConfig::default();
1966 let grover = OptimizedGroverAlgorithm::new(config).unwrap();
1967
1968 let num_items = 16; let num_targets = 1;
1970 let iterations = grover.calculate_optimal_iterations(num_items, num_targets);
1971
1972 assert!(iterations >= 3 && iterations <= 4);
1974 }
1975
1976 #[test]
1977 fn test_phase_estimation_creation() {
1978 let config = QuantumAlgorithmConfig::default();
1979 let qpe = EnhancedPhaseEstimation::new(config);
1980 assert!(qpe.is_ok());
1981 }
1982
1983 #[test]
1984 fn test_continued_fractions() {
1985 let config = QuantumAlgorithmConfig::default();
1986 let shor = OptimizedShorAlgorithm::new(config).unwrap();
1987
1988 let convergents = shor.continued_fractions(0.375, 100); assert!(!convergents.is_empty());
1990
1991 assert!(convergents.iter().any(|&(num, den)| num == 3 && den == 8));
1993 }
1994
1995 #[test]
1996 fn test_modular_exponentiation() {
1997 let config = QuantumAlgorithmConfig::default();
1998 let shor = OptimizedShorAlgorithm::new(config).unwrap();
1999
2000 assert_eq!(shor.mod_exp(2, 3, 5), 3); assert_eq!(shor.mod_exp(3, 4, 7), 4); }
2003
2004 #[test]
2005 fn test_phase_estimation_simple() {
2006 let config = QuantumAlgorithmConfig::default();
2007 let mut qpe = EnhancedPhaseEstimation::new(config).unwrap();
2008
2009 let eigenstate = Array1::from_vec(vec![Complex64::new(1.0, 0.0), Complex64::new(0.0, 0.0)]);
2011
2012 let z_unitary = |sim: &mut StateVectorSimulator, _target_qubit: usize| -> Result<()> {
2014 Ok(()) };
2017
2018 let result = qpe.estimate_eigenvalues(z_unitary, &eigenstate, 1e-2);
2019 assert!(result.is_ok());
2020
2021 let qpe_result = result.unwrap();
2022 assert!(!qpe_result.eigenvalues.is_empty());
2023 assert_eq!(qpe_result.eigenvalues.len(), qpe_result.precisions.len());
2024 }
2025
2026 #[test]
2027 fn test_grover_search_functionality() {
2028 let config = QuantumAlgorithmConfig::default();
2029 let mut grover = OptimizedGroverAlgorithm::new(config).unwrap();
2030
2031 let oracle = |x: usize| x == 3;
2033
2034 let result = grover.search(3, oracle, 1);
2035 match &result {
2036 Err(e) => eprintln!("Grover search failed: {:?}", e),
2037 Ok(_) => {}
2038 }
2039 assert!(result.is_ok());
2040
2041 let grover_result = result.unwrap();
2042 assert_eq!(grover_result.iterations, grover_result.optimal_iterations);
2043 assert!(grover_result.success_probability >= 0.0);
2044 assert!(grover_result.success_probability <= 1.0);
2045 }
2046
2047 #[test]
2048 fn test_shor_algorithm_classical_cases() {
2049 let config = QuantumAlgorithmConfig::default();
2050 let mut shor = OptimizedShorAlgorithm::new(config).unwrap();
2051
2052 let result = shor.factor(10).unwrap();
2054 assert!(!result.factors.is_empty());
2055 assert!(result.factors.contains(&2) || result.factors.contains(&5));
2056
2057 let result = shor.factor(7).unwrap();
2059 if !result.factors.is_empty() {
2060 let product: u64 = result.factors.iter().product();
2062 assert_eq!(product, 7);
2063 }
2064 }
2065
2066 #[test]
2067 fn test_quantum_algorithm_benchmarks() {
2068 let benchmarks = benchmark_quantum_algorithms();
2069 assert!(benchmarks.is_ok());
2070
2071 let results = benchmarks.unwrap();
2072 assert!(results.contains_key("shor_15"));
2073 assert!(results.contains_key("grover_4qubits"));
2074 assert!(results.contains_key("phase_estimation"));
2075
2076 for (algorithm, time) in results {
2078 assert!(
2079 time >= 0.0,
2080 "Algorithm {} had negative execution time",
2081 algorithm
2082 );
2083 }
2084 }
2085
2086 #[test]
2087 fn test_grover_optimal_iterations_calculation() {
2088 let config = QuantumAlgorithmConfig::default();
2089 let grover = OptimizedGroverAlgorithm::new(config).unwrap();
2090
2091 assert_eq!(grover.calculate_optimal_iterations(4, 1), 1); assert_eq!(grover.calculate_optimal_iterations(16, 1), 3); let iterations_64_1 = grover.calculate_optimal_iterations(64, 1); assert!(iterations_64_1 >= 6 && iterations_64_1 <= 8);
2097 }
2098
2099 #[test]
2100 fn test_phase_estimation_precision_control() {
2101 let config = QuantumAlgorithmConfig {
2102 precision_tolerance: 1e-3,
2103 ..Default::default()
2104 };
2105 let mut qpe = EnhancedPhaseEstimation::new(config).unwrap();
2106
2107 let eigenstate = Array1::from_vec(vec![Complex64::new(1.0, 0.0)]);
2109 let identity_op =
2110 |_sim: &mut StateVectorSimulator, _target: usize| -> Result<()> { Ok(()) };
2111
2112 let result = qpe.estimate_eigenvalues(identity_op, &eigenstate, 1e-3);
2113 assert!(result.is_ok());
2114
2115 let qpe_result = result.unwrap();
2116 assert!(qpe_result.precisions[0] <= 1e-3);
2117 assert!(qpe_result.phase_qubits >= 3); }
2119}