Алгоритм быстрее, чем просто перебор всех возможных делителей. Но ведь никто не запрещает взять мой алгоритм и способ с sqrt и объединить их. Будет еще быстрее.
Dim x As Long, y As Double, A As Long, a1 As Double, b As Long, c As Long, d As Double, d1 As Long, d2 As Double, d3 As Long, d4 As Double, d5 As Long, y1 As Long, y2 As Double, y3 As Long, y4 As Double, y5 As Long, W As Integer
x = 1
A = InputBox("Введите число")
a1 = A / 10
b = Fix(a1)
c = A - 10 * b
d = A / 3
d1 = Fix(d)
d2 = A / 7
d3 = Fix(d2)
d4 = A / 9
d5 = Fix(d4)
y = 10
y2 = 10
y4 = 10
W = 1
If c = 1 And d1 <> d And d2 <> d3 And d4 <> d5 Then
Do While y >= 0 Or y2 >= 0 Or y4 >= 0 And W = 1
y = (A - 21 - 70 * x) / (100 * x + 30)
y1 = Fix(y)
y2 = (A - 81 - 90 * x) / (100 * x + 90)
y3 = Fix(y2)
y4 = (A - 1 - 10 * x) / (100 * x + 10)
y5 = Fix(y4)
If y = y1 Or y2 = y3 Then W = 0
If y5 = y4 Then If y4 <> 0 Then W = 0
x = x + 1
Loop
Else:
End If
If c = 3 And d1 <> d And d2 <> d3 And d4 <> d5 Then
Do While y >= 0 Or y2 >= 0 And W = 1
y = (A - 3 - 30 * x) / (100 * x + 10)
y1 = Fix(y)
y2 = (A - 63 - 90 * x) / (100 * x + 70)
y3 = Fix(y2)
If y = y1 Or y2 = y3 Then W = 0
x = x + 1
Loop
Else:
End If
If c = 7 And d1 <> d And d2 <> d3 And d4 <> d5 Then
Do While y >= 0 Or y2 >= 0 And W = 1
y = (A - 7 - 70 * x) / (100 * x + 10)
y1 = Fix(y)
y2 = (A - 27 - 90 * x) / (100 * x + 30)
y3 = Fix(y2)
If y = y1 Or y2 = y3 Then W = 0
x = x + 1
Loop
Else:
End If
If c = 9 And d1 <> d And d2 <> d3 And d4 <> d5 Then
Do While y >= 0 Or y2 >= 0 Or y4 >= 0 And W = 1
y = (A - 9 - 90 * x) / (100 * x + 10)
y1 = Fix(y)
y2 = (A - 9 - 30 * x) / (100 * x + 30)
y3 = Fix(y2)
y4 = (A - 49 - 70 * x) / (100 * x + 70)
y5 = Fix(y4)
If y = y1 Or y2 = y3 Or y4 = y5 Then W = 0
x = x + 1
Loop
Else:
End If
If c = 2 Or c = 4 Or c = 6 Or c = 8 Or c = 0 Or c = 5 Or d = d1 Or d2 = d3 Or d4 = d5 Then W = 0
If A = 3 Or A = 5 Or А=2 or A = 7 Then W = 1
If A = 1 Then W = 0
If W = 1 Then MsgBox "число простое" Else: MsgBox "число составное"
Я тоже считаю, что данный алгоритм считает быстрее как минимум в четыре раза, а может и больше, так как алгоритм не считает все возможные варианты при определении первого делителя.
Подвохов нет, так как вся суть в разделении на четыре группы, а остальное дело техники.
Расширять систему выше десятки не рационально, так как теряется вся суть метода, тем более, что он работает на каждом десятке числового ряда.
Неофициальная история говорит, что на земле было более 5 цивилизаций, которые были уничтожены. Цивилизация не успевает вырасти до уровня межпланетной или межгалактической и погибает в результате какого то катаклизма. То есть парадокс Ферми не состоятелен?! А может быть цивилизация пала в результате агрессии со стороны инопланетян? Тогда получается подтверждение парадокса Ферми. Думаю для большинства людей это не принципиально, а вот перспектива вымереть, ведь в мире все циклично, должна людей беспокоить больше, чем наличие или отсутствие инопланетян!!!
Алгоритм быстрее, чем просто перебор всех возможных делителей. Но ведь никто не запрещает взять мой алгоритм и способ с sqrt и объединить их. Будет еще быстрее.
Sub число()
Dim x As Long, y As Double, A As Long, a1 As Double, b As Long, c As Long, d As Double, d1 As Long, d2 As Double, d3 As Long, d4 As Double, d5 As Long, y1 As Long, y2 As Double, y3 As Long, y4 As Double, y5 As Long, W As Integer
x = 1
A = InputBox("Введите число")
a1 = A / 10
b = Fix(a1)
c = A - 10 * b
d = A / 3
d1 = Fix(d)
d2 = A / 7
d3 = Fix(d2)
d4 = A / 9
d5 = Fix(d4)
y = 10
y2 = 10
y4 = 10
W = 1
If c = 1 And d1 <> d And d2 <> d3 And d4 <> d5 Then
Do While y >= 0 Or y2 >= 0 Or y4 >= 0 And W = 1
y = (A - 21 - 70 * x) / (100 * x + 30)
y1 = Fix(y)
y2 = (A - 81 - 90 * x) / (100 * x + 90)
y3 = Fix(y2)
y4 = (A - 1 - 10 * x) / (100 * x + 10)
y5 = Fix(y4)
If y = y1 Or y2 = y3 Then W = 0
If y5 = y4 Then If y4 <> 0 Then W = 0
x = x + 1
Loop
Else:
End If
If c = 3 And d1 <> d And d2 <> d3 And d4 <> d5 Then
Do While y >= 0 Or y2 >= 0 And W = 1
y = (A - 3 - 30 * x) / (100 * x + 10)
y1 = Fix(y)
y2 = (A - 63 - 90 * x) / (100 * x + 70)
y3 = Fix(y2)
If y = y1 Or y2 = y3 Then W = 0
x = x + 1
Loop
Else:
End If
If c = 7 And d1 <> d And d2 <> d3 And d4 <> d5 Then
Do While y >= 0 Or y2 >= 0 And W = 1
y = (A - 7 - 70 * x) / (100 * x + 10)
y1 = Fix(y)
y2 = (A - 27 - 90 * x) / (100 * x + 30)
y3 = Fix(y2)
If y = y1 Or y2 = y3 Then W = 0
x = x + 1
Loop
Else:
End If
If c = 9 And d1 <> d And d2 <> d3 And d4 <> d5 Then
Do While y >= 0 Or y2 >= 0 Or y4 >= 0 And W = 1
y = (A - 9 - 90 * x) / (100 * x + 10)
y1 = Fix(y)
y2 = (A - 9 - 30 * x) / (100 * x + 30)
y3 = Fix(y2)
y4 = (A - 49 - 70 * x) / (100 * x + 70)
y5 = Fix(y4)
If y = y1 Or y2 = y3 Or y4 = y5 Then W = 0
x = x + 1
Loop
Else:
End If
If c = 2 Or c = 4 Or c = 6 Or c = 8 Or c = 0 Or c = 5 Or d = d1 Or d2 = d3 Or d4 = d5 Then W = 0
If A = 3 Or A = 5 Or А=2 or A = 7 Then W = 1
If A = 1 Then W = 0
If W = 1 Then MsgBox "число простое" Else: MsgBox "число составное"
End Sub
Я тоже считаю, что данный алгоритм считает быстрее как минимум в четыре раза, а может и больше, так как алгоритм не считает все возможные варианты при определении первого делителя.
Подвохов нет, так как вся суть в разделении на четыре группы, а остальное дело техники.
Расширять систему выше десятки не рационально, так как теряется вся суть метода, тем более, что он работает на каждом десятке числового ряда.
Это опечатка
Возможно мои познания в программировании, а над "длинной арифметикой" я подумаю на досуге.
Спасибо, исправила.