Кватернионы
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 тоже отсутствует.