-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupper.pl
117 lines (87 loc) · 2.05 KB
/
upper.pl
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
#!/usr/bin/perl
# Daniel "Trizen" Șuteu
# Date: 07 July 2019
# https://github.com/trizen
use 5.014;
use strict;
use ntheory qw(:all);
use experimental qw(signatures);
use Math::GMPz;
prime_precalc(1e6);
#use Math::AnyNum qw(:overload);
sub f($n) {
my $count = -1;
while (is_semiprime($n) && !is_square($n)) {
my ($x, $y) = factor($n);
$n = ($y - $x);
++$count;
}
$count;
}
use Memoize qw(memoize);
memoize('a');
sub a($n) {
if ($n == 0) {
return 6;
}
if ($n <= 1) {
#return [ 6, 34, 82, 226, 687, 4786, 14367, 28738, 373763, 21408927]->[$n];
#my $k = 2519240627,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;
#return $k * ($k + Math::GMPz->new("7136306"));
return Math::GMPz->new(2519240627);
#return 26;
#return 79139915
#return Math::AnyNum->new("79139915");
}
#if ($n <= ) {
# return 6
#}
my $t = a($n - 1);
my $res;
#~ foreach my $mul(10000..20000) {
#~ foreach my $rem(0..20) {
#~ foreach my $add(1..100) {
#~ $res = ($t + $add)*$mul + $rem;
#~ if (f($res) >= $n) {
#~ return $res;
#~ }
#~ }
#~ }
#~ }
#my @collect;
for (my $x = 2 ; $x <= 100000 ; $x = next_prime($x)) {
my $r = $x * ($t + $x);
if (is_semiprime($r) and f($r) >= $n) {
for (my $y = 2 ; $y <= 100000 ; $y = next_prime($y)) {
my $u = $y * ($r + $y);
if (is_semiprime($u) and f($u) > $n) {
return $r;
}
}
}
}
#$collect[rand @collect]
#if (f($r) >= $n) {
# return $r;
#}
#~ while (1) {
#~ for(my $x = 2; $x <= 100; $x = next_prime($x)) {
#~ if (f($x * ($t+$x)) >= $n) {
#~ $z = $x;
#~ last;
#~ }
#~ }
#~ last if defined($z);
#~ $t = next_prime($t);
#~ $t += 1;
#~ }
#$z * ($t+$z);
#$res;
}
foreach my $k (0 .. 30) {
say "a(", f(a($k)), ") <= ", a($k);
}
__END__
for k in (0..12) {
say "a(#{k}) <= #{a(k)}"
}