Здравствуйте.
Мне известен способ представления натуральных чисел точками в пространстве размерности

. Интересно было бы увидеть, как в этом пространстве распределены простые числа.
Пожалуйста, помогите закодировать в C++ алгоритм, который я приведу ниже. Потребуется работа с массивами и матрицами, но программа должна получиться несложной. Вся работа выполняется исключительно в натуральных числах.
Алгоритм представления натуральных чисел точками в пространстве размерности 
1. Число вычисляется как результат скалярного произведения векторов

и, таким образом, зависит от четырех параметров, которые мы будем считать его координатами:

.
2. Каждый из векторов, например, вектор

принадлежит упорядоченному множеству

где

- номер множества, и имеет в этом множестве номер

.
3. Построение множества

рассмотрим на примере

. Алгоритм его построения следующий:
3.1. Построить матрицу

по правилу:

. В результате (здесь для

) получится "квадрат Паскаля":

3.2. Извлечь из матрицы

первую строку и построить матрицу

содержащую на главной диагонали и первой диагонали под ней эту строку, а остальные элементы имеющую равными нулю:

3.3. Возвести матрицу

в соответствующие степени и получить векторы множества

по правилу:

где

- первый орт (упорядоченное множество векторов

является ни чем иным, как Треугольником Паскаля):

Любое другое множество

строится аналогично при помощи строки с номером

из матрицы

.
4. Построить все множества

при помощи

-тых строк матрицы

.
5. Вычислить все скалярные произведения векторов принадлежащих полученным множествам при том условии, что нельзя перемножать между собой векторы принадлежащие одному множеству:

.
6. Проверить полученные значения

на простоту. В случае положительного результата вывести их в виде

.
7. Построить четыре трехмерных сечения полученного множества точек:

или визуализировать результать каким-либо иным способом.
P.S. Конечно, совсем не обязательно строить и хранить все множества

для того чтобы организовать перебор попарных сочетаний принадлежащих им векторов. Видимо, будет экономнее строить каждый вектор скалярного произведения по его индексам, проверять получившееся число и переходить к следующему скалярному произведению.