Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
5 / 5 / 0
Регистрация: 16.03.2017
Сообщений: 84

Скатерть Улама (спираль простых чисел)

20.11.2018, 23:06. Показов 5571. Ответов 10

Студворк — интернет-сервис помощи студентам
Задание:
Файл primespiral :
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
function [Sout,Pout] = primespiral(n,c)
% PRIMESPIRAL  Ulam's prime number spiral.
%   PRIMESPIRAL(n,c) plots the prime numbers in the n-by-n matrix
%   generated by storing c:c+n^2 in a spiral pattern starting in
%   the center.  The concentration of primes on some of the diagonals
%   is remarkable.  This phenomenon was discovered by Stanislaw Ulam
%   in 1963, and featured on the cover of Scientific American in
%   March, 1964.  For n <= 42, primespiral(n,c) shows the spiral 
%   numbering scheme.  The default value of c is 1.
%
%   With one or two output arguments,
%      S = primespiral(n,c), or
%      [S,P] = primespiral(n,c)
%   does no plotting, but returns S = prime spiral and P = isprime(S).
%
%   Examples:
%      primespiral(7)
%      primespiral(17,17)
%      primespiral(41,41)
%      primespiral(200)
 
%   Copyright 2013 Cleve Moler and The MathWorks, Inc.
 
if nargout > 0
   [Sout,Pout] = spiralprimes(n,c);
   return
end
 
if ~isequal(get(gcf,'name'),'Prime spiral')
   clf
   shg
   b(1) = uicontrol('sty','tog','uni','nor','pos',[.02 .02 .05 .05], ...
      'string','<','fontweight','bold','callback','primespiral(''<'')');
   b(2) = uicontrol('sty','tog','uni','nor','pos',[.08 .02 .05 .05], ...
      'string','-','fontweight','bold','callback','primespiral(''-'')');
   b(3) = uicontrol('sty','tog','uni','nor','pos',[.14 .02 .05 .05], ...
      'string','+','fontweight','bold','callback','primespiral(''+'')');
   b(4) = uicontrol('sty','tog','uni','nor','pos',[.20 .02 .05 .05], ...
      'string','>','fontweight','bold','callback','primespiral(''>'')');
   set(gcf,'name','Prime spiral','menu','none','numbertitle','off', ...
      'userdata',b);
   uicontrol('uni','nor','pos',[.90 .02 .08 .05], ...
      'string','close','callback','close(gcf)')
end
b = get(gcf,'userdata');
 
if nargin < 1, n = 200; end
if nargin < 2, c = 1; end
if isstr(n)
   if n ~= '<', set(b(1),'value',0), end
   if n ~= '>', set(b(4),'value',0), end
   c = get(b(1),'userdata');
   if n == '<' | n == '-', c = max(c-1,1); end
   if n == '>' | n == '+', c = c+1; end
   n = get(b(4),'userdata');
end
set(b(1),'userdata',c)
set(b(4),'userdata',n)
 
while c >= 1
   [S,P] = spiralprimes(n,c);
   spydetail(S,P)
   title(['c = ' int2str(c)])
   xlabel([int2str(nnz(P)) ' primes'])
   drawnow
   if get(b(1),'value'), c = max(c-1,1); end
   if get(b(4),'value'), c = c+1; end
   set(b(1),'userdata',c)
   if get(b(1),'value') == 0 & get(b(4),'value') == 0
      break
   end
end
if c == 1
   set(b(1:2),'enable','off')
else
   set(b(1:2),'enable','on')
end
set(b([1 4]),'value',0)
 
% ------------------------
 
function [S,P] = spiralprimes(n,c)
% SPIRALPRIMES
%   [S,P] = spiralprimes(n,c) returns two n-by-n matrices.
%   S is the spiral numbering of c:c+n^2-1.
%   P is true for the primes in S.
 
m = n^2-1+c;
P = zeros(m,1);
P(primes(m)) = 1;
S = spiral(n)+c-1;
P = reshape(P(S(:)),n,n);
 
% ------------------------
 
function S = spiral(n)
%SPIRAL SPIRAL(n) is an n-by-n matrix with elements
%   1:n^2 arranged in a rectangular spiral pattern.
 
S = [];
for m = 1:n
   S = rot90(S,2);
   S(m,m) = 0;
   p = m^2-m+1;
   v = (m-1:-1:0);
   S(:,m) = p-v';
   S(m,:) = p+v;
end
if mod(n,2)==1
   S = rot90(S,2);
end
 
% ------------------------
 
function spydetail(S,P)
% SPYDETAIL
%   SPYDETAIL(S,P) is like SPY(P) with the element values from S.
 
[n,n] = size(P);
if n <= 42
   delete(gca)
   axis([0 n+1 0 n+1])
   axis square
   axis ij
   for i = 1:n
      for j = 1:n
         if P(i,j)
            color = [0 0 1];
            fs = max(1,floor(16-2*log2(n)));
         else
            color = [1/3 1/3 1/3];
            fs = max(1,floor(16-3*log2(n)));
         end
         text(j,i,int2str(S(i,j)),'fontsize',fs,'color',color)
      end
   end
else
   if n <= 500, ms = 6; else, ms = 1; end
   [i,j] = find(P);
   plot(j,i,'.','markersize',ms)
   axis([0 n+1 0 n+1])
   axis square
   axis ij
end

Благодарность, тому кто поможет=)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2018, 23:06
Ответы с готовыми решениями:

Скатерть Улама
Нужно построить скатерть Улама в паскале. О скатерти улама: ссылка

Java задачка скатерть Улама
Реализовать в двумерном массиве скатерть Улама. https://ru.wikipedia.org/wiki/Скатерть_Улама

Скатерть Улама - помогите доработать прогу :)
Есть код программы, но что-то не могу заставить его работать в Visual Studio 2008.. int simple(int n) { int i; int ret=1; ...

10
5 / 5 / 0
Регистрация: 16.03.2017
Сообщений: 84
20.11.2018, 23:19  [ТС]
Задание: Изучите работу функции primespiral.m, генерирующей спираль простых чисел размером nxn с числом c в середине.
Исследуйте особенности спиралей, получающихся при вызове этой функции со следующими параметрами: primespiral(17,17); primespiral(41,41); Определите, в чем заключаются эти особенности. Найдите значения параметров n и c , меньшие 50 и не равные 17 или 41, такие, что получающаяся спираль простых чисел содержит не менее 8 простых чисел на диагонали.
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
21.11.2018, 11:21
Лучший ответ Сообщение было отмечено Kristina1234 как решение

Решение

Kristina1234,
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
clear; clc;
nn = [];
cc = [];
for n = 1:49
    if n ~= 17 && n ~= 41
        for c = 1:49
            if c ~= 17 && c ~= 41
                [~,ww] = primespiral(n,c);
                if sum(diag(ww)) > 7
                    nn = [nn n];
                    cc = [cc c];
                end
            end
        end
    end
end
1
5 / 5 / 0
Регистрация: 16.03.2017
Сообщений: 84
21.11.2018, 14:17  [ТС]
она не работает.
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
21.11.2018, 15:43
Цитата Сообщение от Kristina1234 Посмотреть сообщение
она не работает.
что именно?
0
5 / 5 / 0
Регистрация: 16.03.2017
Сообщений: 84
21.11.2018, 16:20  [ТС]
сейчас попробовала на другом компьютере(домашнем), программа запустилась, возможно зависит от версии, на рабочих ругалась на скобки в 8 строчке. Большое спасибо!
Александр, не могли бы Вы, еще объяснить как все происходит в этом коде,типо комментарии, особенно середина не совсем понятна. По методичке мы работаем по примерно такому коду, но он не запускается, выдает ошибки. Понимаю что это лишь аналогичный вид записи, но матлаб изучаем недавно. Поэтому если не сложно, объясните поподробнее пожалуйста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function PR1 = primespiral1(m) %m - входной параметр 
j=1; 
for n=9:49 %проверяем спирали с параметром от 9 до 49(<50) включительно) 
if n~=17 & n~=41 %условие n не равно 17 и 41 
P = zeros(n,n); %нулевая квадратная матрица n x n 
P(primes(n^2)) = 1;%возвращает вектор строку 
P = P(S); 
st=0; 
for i=1:n 
if PR2(i,i)==1 st=st+1;end;%считаем количество диагональных элементов, равных1 
end; 
if st>(m-1) 
PR1(j)=n;j=j+1; end;%в массив PR1 записываем номера n, при которых на диагонали больше либо равно m чисел 
end; 
end; 
end
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
24.11.2018, 22:45
Kristina1234, один шаг цикла: n = 9, создаете матрицу P, размером nxn, всего получается 81 элемент. Функция primes(n^2) даст вам все простые числа от 1 до n^2 (2, 3, 5, 7 ...). На эти места вы в матрицу P записываете 1 (не забываем, что в matlab нумерация идет по столбцам, т.е. сначала заполняется первый столбец, потом второй и т.д.). Строка 7 не нужна. Дальше вы проверяете все диагональные элементы. Вот тут вам надо исправить PR2 на просто P (строка 10). Если он равен 1 (т.е. это простое число), то вы увеличиваете счетчик на 1. Ну и в конце смотрите, если счетчик больше числа m, то значит данное число n вам подходит, и вы его записываете в выходной массив.
0
5 / 5 / 0
Регистрация: 16.03.2017
Сообщений: 84
25.11.2018, 14:05  [ТС]
АлександрКом,
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function PR1 = primespiral1(m) %m - входной параметр
j=1;
for n=9:49 %проверяем спирали с параметром от 9 до 49(<50) включительно)
if n~=17 & n~=41 %условие n не равно 17 и 41
P = zeros(n,n); %нулевая квадратная матрица n x n
P(primes(n^2)) = 1;%возвращает вектор строку
st=0;
for i=1:n
if P(i,j)==1; st=st+1;end;%считаем количество диагональных элементов, равных1
end;
if st>(m-1)
PR1(j)=n;j=j+1; end;%в массив PR1 записываем номера n, при которых на диагонали больше либо равно m чисел
end;
end;
end
Исправила код, но выдает ошибку со строчкой - if st>(m-1)
Можете подсказать, что исправить?
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
25.11.2018, 16:12
Kristina1234,
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function PR1 = primespiral1(m) %m - входной параметр 
j=1; 
for n=9:49 %проверяем спирали с параметром от 9 до 49(<50) включительно) 
if n~=17 & n~=41 %условие n не равно 17 и 41 
P = zeros(n,n); %нулевая квадратная матрица n x n 
P(primes(n^2)) = 1;%возвращает вектор строку 
%P = P(S); 
st=0; 
for i=1:n 
if P(i,i)==1 st=st+1;end;%считаем количество диагональных элементов, равных1 
end; 
if st>(m-1) 
PR1(j)=n;j=j+1; end;%в массив PR1 записываем номера n, при которых на диагонали больше либо равно m чисел 
end; 
end; 
end
0
5 / 5 / 0
Регистрация: 16.03.2017
Сообщений: 84
25.11.2018, 18:17  [ТС]
АлександрКом,
Все равно(
АлександрКом, Можете тогда объяснить по Вашему коду? Спасибо
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
26.11.2018, 11:07
Лучший ответ Сообщение было отмечено Kristina1234 как решение

Решение

Kristina1234, вам же matlab явно указывает на ошибку: "Not enough input arguments", что значит, что при вызове функции вы не указали входные аргументы. Вы же должны указать, сколько диагональных элементов вы хотите получить. Правильный вызов:
Matlab M
1
PR1 = primespiral1(5)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.11.2018, 11:07
Помогаю со студенческими работами здесь

Спираль Улама C++
Помогите найти ошибку. Пытаюсь заставить программу выводить числа по спирали, замену простых чисел на значки не делал. #include...

Спираль Улама
Помогите пожалуйста, на языке си написать программу спираль Улама.Ввести рандомную матрицу и вместо простых чисел оставить*,а вместо...

Нахождение простых, взаимно-простых и парно-простых чисел из указанного диапазона
Нужна помощь мне нужно создать программу для нахождение простых,взаимнопростых и парно простых чисел из указанного диапазона. у меня...

Изобразить прямоугольную спираль из 5 витков. Обеспечить циклическое изменение (1 пиксел - 3 пиксела) толщины линий, которыми отрисована спираль
Спираль из 5 витков изобразил... помогите пожалуйста сделать анимацию изменения толщины линий unit Unit1; interface uses ...

Изобразить прямоугольную спираль из 5 витков. Обеспечить циклическое изменение (1 пиксел - 3 пиксела) толщины линий, которыми отрисована спираль
Спираль из 5 витков изобразил... помогите пожалуйста сделать анимацию изменения толщины линий unit Unit1; interface uses ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru