if (ctx->hardware_rng == QANSEL_HARDWARE_AUTO)
{
- ctx->random_file = fopen("/dev/TrueRNG0", "r");
+ ctx->random_file = fopen("/dev/qrandom0", "r");
if (ctx->random_file == NULL)
{
- if (qansel_hardware_rand_supported())
+ ctx->random_file = fopen("/dev/TrueRNG0", "r");
+ if (ctx->random_file == NULL)
{
- if (ctx->verbose) printf("QAnsel: Hardware `Intel Secure Key Technology` selected.\n");
- ctx->hardware_rng = QANSEL_HARDWARE_RDSEED;
+ if (qansel_hardware_rand_supported())
+ {
+ if (ctx->verbose) printf("QAnsel: Hardware `Intel Secure Key Technology` selected.\n");
+ ctx->hardware_rng = QANSEL_HARDWARE_RDSEED;
+ }
+ else
+ {
+ fprintf(stderr, "QAnsel: No supported hardware random number generator found.\n");
+ return 0;
+ }
}
else
{
- fprintf(stderr, "QAnsel: No supported hardware random number generator found.\n");
- return 0;
+ if (ctx->verbose) printf("QAnsel: Hardware `TrueRNG` selected.\n");
+ strcpy(ctx->random_path, "/dev/TrueRNG0");
+ ctx->hardware_rng = QANSEL_HARDWARE_TRUERNG;
+ ctx->buffer_size = -1;
}
}
else
{
- if (ctx->verbose) printf("QAnsel: Hardware `TrueRNG` selected.\n");
+ if (ctx->verbose) printf("QAnsel: Hardware `Quantis` selected.\n");
+ strcpy(ctx->random_path, "/dev/qrandom0");
ctx->hardware_rng = QANSEL_HARDWARE_TRUERNG;
+ ctx->buffer_size = 65535;
+ ctx->buffer_pos = 0;
}
}
if (ctx->optimization_level & QANSEL_MODE_METAL)
useColor = false;
}
var gate = {};
+ gate.i =
+ [
+ [1, 0], [0, 0],
+ [0, 0], [1, 0],
+ ];
gate.x =
[
[0, 0], [1, 0],
[0, 0], [-1, 0],
];
var R = 1/Math.sqrt(2);
+ [
+ [ 1, 0 ], [ 0, 0 ],
+ [ 0, 0 ], [ 1, 0 ],
+ ];
gate.h =
[
[ R, 0 ], [ R, 0 ],
];
gate.reset = "reset";
gate.measure = "measure";
+ gate.add = function(a, b)
+ {
+ var ret =
+ [
+ [0, 0], [0, 0],
+ [0, 0], [0, 0]
+ ];
+ for (var i = 0; i < ret.length; i++)
+ {
+ ret[i] = complex.add(a[i], b[i]);
+ }
+ return ret;
+ };
+ gate.mul1 = function(a, b)
+ {
+ var ret =
+ [
+ [0, 0], [0, 0],
+ [0, 0], [0, 0]
+ ];
+ for (var i = 0; i < ret.length; i++)
+ {
+ ret[i] = complex.multiply(a[i], b);
+ }
+ return ret;
+ };
+ gate.copy = function(a)
+ {
+ var ret =
+ [
+ [0, 0], [0, 0],
+ [0, 0], [0, 0]
+ ];
+ for (var i = 0; i < ret.length; i++)
+ {
+ ret[i] = a[i];
+ }
+ return ret;
+ };
+ gate.div1 = function(a, b)
+ {
+ var ret =
+ [
+ [0, 0], [0, 0],
+ [0, 0], [0, 0]
+ ];
+ for (var i = 0; i < ret.length; i++)
+ {
+ ret[i] = complex.divide(a[i], b);
+ }
+ return ret;
+ };
+ gate.pow1 = function(a, b)
+ {
+ var ret =
+ [
+ [0, 0], [0, 0],
+ [0, 0], [0, 0]
+ ];
+ for (var i = 0; i < ret.length; i++)
+ {
+ ret[i] = complex.power(a[i], b);
+ }
+ return ret;
+ };
+ gate.exp = (g, p) =>
+ {
+ var ret = gate.copy(gate.i);
+ for (var i = 0; i < p; i++)
+ {
+ var tmp = gate.copy(g);
+ gate.div(tmp, factorial(i + 1));
+ ret = gate.add(ret, tmp);
+ }
+ return ret;
+ };
+ gate.log = (g, p) =>
+ {
+ var ret = gate.add(g, gate.mul1(gate.i, [-1, 0]));
+ for (var i = 2; i < p; i++)
+ {
+ console.log(i + ": " + (i % 2 == 0 ? " - " : " + ") + "(1/" + i + ")(A - I)^" + i);
+ var tmp = gate.add(g, gate.mul1(gate.i, [-1, 0]));
+ tmp = gate.pow1(tmp, i);
+ tmp = gate.div1(tmp, [i, 0]);
+ if (i % 2 == 0) tmp = gate.mul1(tmp, [-1, 0]);
+ ret = gate.add(ret, tmp);
+ }
+ return ret;
+ };
var complex = {};
complex.multiply = (a, b) =>
{
return Math.sqrt( Math.pow(a[0], 2) + Math.pow(a[1], 2) );
};
+ complex.power = (a, n) =>
+ {
+ const r = Math.sqrt(a[0] * a[0] + a[1] * a[1]);
+ const theta = Math.atan2(a[1], a[0]);
+ const rPowerN = Math.pow(r, n);
+ const newTheta = n * theta;
+ const realPart = rPowerN * Math.cos(newTheta);
+ const imaginaryPart = rPowerN * Math.sin(newTheta);
+ return [realPart, imaginaryPart];
+ };
+ complex.divide = (a, b) =>
+ {
+ d = b[1];
+ c = b[0];
+ b = a[1];
+ a = a[0];
+ var denominator = c * c + d * d;
+ var realPart = (a * c + b * d) / denominator;
+ var imaginaryPart = (b * c - a * d) / denominator;
+ return [realPart, imaginaryPart];
+ };
var qubit = {};
qubit.state = [ [1, 0], [0, 0] ];
return sprite;
}
+ function factorial(n)
+ {
+ if (n === 0 || n === 1)
+ {
+ return 1;
+ }
+ return n * factorial(n - 1);
+ }
/*
var sphereCenterY = sphere.position.y; // Y position of the sphere's center
var sphereRadius = 1; // Radius of the sphere