




import numpy as np
import qiskit







def      lowerCamelCase_						(			UpperCamelCase__							: int = 8					,	UpperCamelCase__							: int | None = None )	->			str:





				"""simple docstring"""


				__lowerCamelCase									=       np.random.default_rng(seed=UpperCamelCase__ )

				# Roughly 25% of the qubits will contribute to the key.
				# So we take more than we need.
				__lowerCamelCase									=       6 * key_len
				# Measurement basis for Alice's qubits.
				__lowerCamelCase									=       rng.integers(2					,	size=UpperCamelCase__ )
				# The set of states Alice will prepare.
				__lowerCamelCase									=       rng.integers(2					,	size=UpperCamelCase__ )
				# Measurement basis for Bob's qubits.
				__lowerCamelCase									=       rng.integers(2					,	size=UpperCamelCase__ )

				# Quantum Circuit to simulate BB84
				__lowerCamelCase									=       qiskit.QuantumCircuit(UpperCamelCase__					,	name='BB84' )

				# Alice prepares her qubits according to rules above.
				for index, _ in enumerate(UpperCamelCase__ ):
								if alice_state[index] == 1:
												bbaa_circ.x(UpperCamelCase__ )
								if alice_basis[index] == 1:
												bbaa_circ.h(UpperCamelCase__ )
				bbaa_circ.barrier()

				# Bob measures the received qubits according to rules above.
				for index, _ in enumerate(UpperCamelCase__ ):
								if bob_basis[index] == 1:
												bbaa_circ.h(UpperCamelCase__ )

				bbaa_circ.barrier()
				bbaa_circ.measure_all()

				# Simulate the quantum circuit.
				__lowerCamelCase									=       qiskit.Aer.get_backend('aer_simulator' )
				# We only need to run one shot because the key is unique.
				# Multiple shots will produce the same key.
				__lowerCamelCase									=       qiskit.execute(UpperCamelCase__					,	UpperCamelCase__					,	shots=1					,	seed_simulator=UpperCamelCase__ )
				# Returns the result of measurement.
				__lowerCamelCase									=       job.result().get_counts(UpperCamelCase__ ).most_frequent()

				# Extracting the generated key from the simulation results.
				# Only keep measurement results where Alice and Bob chose the same basis.
				__lowerCamelCase									=       ''.join(
				    [
				        result_bit
				        for alice_basis_bit, bob_basis_bit, result_bit in zip(
				            UpperCamelCase__					,	UpperCamelCase__					,	UpperCamelCase__ )
				        if alice_basis_bit == bob_basis_bit
				    ] )

				# Get final key. Pad with 0 if too short, otherwise truncate.
				__lowerCamelCase									=       gen_key[:key_len] if len(UpperCamelCase__ ) >= key_len else gen_key.ljust(UpperCamelCase__					,	'0' )
				return key


if __name__ == "__main__":
					print(f'''The generated key is : {bbaa(8, seed=0)}''')
					from doctest import testmod

					testmod()








from sklearn.metrics import mean_squared_error

import datasets


__A								=       "\\n@article{scikit-learn,\n title={Scikit-learn: Machine Learning in {P}ython},\n author={Pedregosa, F. and Varoquaux, G. and Gramfort, A. and Michel, V.\n         and Thirion, B. and Grisel, O. and Blondel, M. and Prettenhofer, P.\n         and Weiss, R. and Dubourg, V. and Vanderplas, J. and Passos, A. and\n         Cournapeau, D. and Brucher, M. and Perrot, M. and Duchesnay, E.},\n journal={Journal of Machine Learning Research},\n volume={12},\n pages={2825--2830},\n year={2011}\n}\n"

__A								=       "\\nMean Squared Error(MSE) is the average of the square of difference between the predicted\nand actual values.\n"


__A								=       "\nArgs:\n    predictions: array-like of shape (n_samples,) or (n_samples, n_outputs)\n        Estimated target values.\n    references: array-like of shape (n_samples,) or (n_samples, n_outputs)\n        Ground truth (correct) target values.\n    sample_weight: array-like of shape (n_samples,), default=None\n        Sample weights.\n    multioutput: {\"raw_values\", \"uniform_average\"} or array-like of shape (n_outputs,), default=\"uniform_average\"\n        Defines aggregating of multiple output values. Array-like value defines weights used to average errors.\n\n        \"raw_values\" : Returns a full set of errors in case of multioutput input.\n\n        \"uniform_average\" : Errors of all outputs are averaged with uniform weight.\n\n    squared : bool, default=True\n        If True returns MSE value, if False returns RMSE (Root Mean Squared Error) value.\n\nReturns:\n    mse : mean squared error.\nExamples:\n\n    >>> mse_metric = datasets.load_metric(\"mse\")\n    >>> predictions = [2.5, 0.0, 2, 8]\n    >>> references = [3, -0.5, 2, 7]\n    >>> results = mse_metric.compute(predictions=predictions, references=references)\n    >>> print(results)\n    {'mse': 0.375}\n    >>> rmse_result = mse_metric.compute(predictions=predictions, references=references, squared=False)\n    >>> print(rmse_result)\n    {'mse': 0.6123724356957945}\n\n    If you're using multi-dimensional lists, then set the config as follows :\n\n    >>> mse_metric = datasets.load_metric(\"mse\", \"multilist\")\n    >>> predictions = [[0.5, 1], [-1, 1], [7, -6]]\n    >>> references = [[0, 2], [-1, 2], [8, -5]]\n    >>> results = mse_metric.compute(predictions=predictions, references=references)\n    >>> print(results)\n    {'mse': 0.7083333333333334}\n    >>> results = mse_metric.compute(predictions=predictions, references=references, multioutput='raw_values')\n    >>> print(results) # doctest: +NORMALIZE_WHITESPACE\n    {'mse': array([0.41666667, 1. ])}\n"







@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION     ,							_KWARGS_DESCRIPTION					)
class        __lowerCAmelCase					(			datasets.Metric					):

			"""simple docstring"""







			def  lowercase_       ( self				)       -> Union[str, Any]:



							'''simple docstring'''
							return datasets.MetricInfo(
							    description=_DESCRIPTION     ,		citation=_CITATION     ,		inputs_description=_KWARGS_DESCRIPTION     ,		features=datasets.Features(self._get_feature_types()				)     ,		reference_urls=[
							        'https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html'
							    ]     ,		)


			def  lowercase_       ( self				)       -> Tuple:



							'''simple docstring'''
							if self.config_name == "multilist":
											return {
											    "predictions": datasets.Sequence(datasets.Value('float'				)				),
											    "references": datasets.Sequence(datasets.Value('float'				)				),
											}
							else:
											return {
											    "predictions": datasets.Value('float'				),
											    "references": datasets.Value('float'				),
											}






			def  lowercase_       ( self     ,		lowerCamelCase__     ,		lowerCamelCase__     ,		lowerCamelCase__=None     ,		lowerCamelCase__="uniform_average"     ,		lowerCamelCase__=True				)       -> List[Any]:



							'''simple docstring'''
							__lowerCamelCase									=       mean_squared_error(
							    lowerCamelCase__     ,		lowerCamelCase__     ,		sample_weight=lowerCamelCase__     ,		multioutput=lowerCamelCase__     ,		squared=lowerCamelCase__				)

							return {"mse": mse}


