Кватернионы
index.htm - English text
quaternion.zip - архивированная директория.
Здесь использовался пакет программ Jnl, доступный по адресам.
http://www.vni.com/products/wpd/jnl/
ftp://wig.ethz.ch/pub/VNI/wpd/jnl/jnl.zip
Пакет был декомпилирован при помощи Jad.exe, сейчас расположен в директории VisualNumerics приложения quaternion.zip.
Возникал вопрос, можно ли пользоваться Jad при суперкомпиляции. Данный пример дает положительный ответ на этот вопрос.
В VisualNumerics я использовал программы для работы с комплексными матрицами.
При помощи суперкомпилятора можно легко получить операции над кватернионами.
Кватернионы можно определять разными способами.
Были написаны небольшие программы addQ, subQ, mulQ quaternion.java, которые по двум массивам из 4 действительных чисел строят указанные комплексные матрицы и обращаются к нужной операции над матрицами. Остаточные программы приведены в quaternion.js
При помощи кватернионов можно получать числовые равенства, в которых сумма четырех квадратов, умноженная на другую сумму четырех квадратов, опять равна сумме четырех квадратов. Например,
( 12 + 22 + 32 + 42 ) ( 22 + 32 + 42 + 52 ) = 362 + 62 + 122 + 122
Числа в скобках можно брать любыми.
Для получения таких равенств в программе quaternion.java метод main был написан так
public static int[] qInt = {1, 2, 3, 4};
public static int[] pInt = {2, 3, 4, 5};
public static double[] qres = new double[4];
public static void main (String[] args) {
double[] q = new double[4];
double[] p = new double[4];
q[0] = qInt[0];
q[1] = qInt[1];
q[2] = qInt[2];
q[3] = qInt[3];
p[0] = pInt[0];
p[1] = pInt[1];
p[2] = pInt[2];
p[3] = pInt[3];
qres = mulQ(q, p);
int[] qresInt = new int[4];
qresInt[0] = (int)qres[0];
qresInt[1] = (int)qres[1];
qresInt[2] = (int)qres[2];
qresInt[3] = (int)qres[3];
System.out.println( "( " + qInt[0] + "^2 + " + qInt[1] + "^2 + " + qInt[2] + "^2 + " + qInt[3] + "^2 ) " +
"( " + pInt[0] + "^2 + " + pInt[1] + "^2 + " + pInt[2] + "^2 + " + pInt[3] + "^2 ) = " +
" " + qresInt[0] + "^2 + " + qresInt[1] + "^2 + " + qresInt[2] + "^2 + " + qresInt[3] + "^2" );
}
Остаточная программа такова
//-------------------------------------- 6 sec - postprocessing...
public static void main (final java.lang.String[] args_139)
{
final double q_0_144 = (double)Quaternion.qInt[0];
final double q_1_147 = (double)Quaternion.qInt[1];
final double q_2_150 = (double)Quaternion.qInt[2];
final double q_3_153 = (double)Quaternion.qInt[3];
final double p_0_156 = (double)Quaternion.pInt[0];
final double p_1_159 = (double)Quaternion.pInt[1];
final double p_2_162 = (double)Quaternion.pInt[2];
final double p_3_165 = (double)Quaternion.pInt[3];
final double[] c_166 = new double[4];
final double im_204 = -p_3_165;
final double re_209 = -p_1_159;
final double im_215 = -(-p_2_162);
final double re_381 = q_1_147 * p_0_156 - q_2_150 * im_204 + (q_0_144 * p_1_159 - q_3_153 * p_2_162);
final double im_382 = q_1_147 * im_204 + q_2_150 * p_0_156 + (q_0_144 * p_2_162 + q_3_153 * p_1_159);
final double im_431 = q_1_147 * im_215 + q_2_150 * re_209 + (q_0_144 * p_3_165 + q_3_153 * p_0_156);
c_166[0] = q_1_147 * re_209 - q_2_150 * im_215 + (q_0_144 * p_0_156 - q_3_153 * p_3_165);
c_166[1] = re_381;
c_166[2] = im_382;
c_166[3] = im_431;
Quaternion.qres = c_166;
java.lang.System.out.println("( " + Quaternion.qInt[0] + "^2 + " + Quaternion.qInt[1] + "^2 + " + Quaternion.qInt[2] + "^2 + " + Quaternion.qInt[3] + "^2 ) ( " + Quaternion.pInt[0] + "^2 + " + Quaternion.pInt[1] + "^2 + " + Quaternion.pInt[2] + "^2 + " + Quaternion.pInt[3] + "^2 ) = " + (int)Quaternion.qres[0] + "^2 + " + (int)Quaternion.qres[1] + "^2 + " + (int)Quaternion.qres[2] + "^2 + " + (int)Quaternion.qres[3] + "^2") /*virtual*/;
return;
}
//-------------------------------------- 7 sec - JScp version 0.0.76
Напомню, что в исходной программе по четырем числам строится кватернион в виде комплексной квадратной матрицы размера 2. Ни матриц, ни комплексных чисел в остаточной программе не наблюдается. Пакет Jnl тоже отсутствует.