倪举鹏 发表于 2017-11-4 17:03:36

高斯不是有个公式计算原点圆内整数坐标点个数的么,可以利用啊

KeyTo9_Fans 发表于 2017-11-16 22:58:56

与本贴问题相关的两个数列已经被【在线整数数列百科大全】收录了,

数列编号为A293288和A293289。

前者是圆内小正方形个数,后者是圆上小正方形个数。

这两个数列都更新到了第$32$项,都是直接使用了Ickiverar在$38$楼提供的数据,

感谢Ickiverar、Chyanog和Wayne提供的宝贵素材:

LINKS:
Yi Yang: Table of n, a(n) for n = 0..32
Chyanog: Illustration of initial terms
Wayne, Ickiverar: The C++ code generating the sequence

其中【Table of n, a(n) for n = 0..32】的贡献者应该是Ickiverar,但是我提交的时候没写上去,所以系统就自动填了提交者的名字。

等我拿到更多素材去更新这个数列的时候,看看能否把这个地方改掉。

wayne 发表于 2017-11-17 11:13:28

KeyTo9_Fans 发表于 2017-11-16 22:58
与本贴问题相关的两个数列已经被【在线整数数列百科大全】收录了,

数列编号为A293288和A293289。


搜了下, Yi Yang总共贡献了14个数列.
---------------
插曲:最开始搜索的时候没有加引号,一不小心,搜到了 https://oeis.org/A102241.          Yi Jing Algebra, 好神奇:http://www.yijing.co.uk ,:lol

chyanog 发表于 2019-8-14 14:04:58

这个问题可以推广到三维吗?即门格海绵(Menger sponge)与球的交集。我画了几幅图


补充内容 (2019-12-2 21:27):
http://www.lactamme.polytechnique.fr/Mosaic/images/MENG.C4.5.1.D/display.html 已经有人画过这样的图了

hujunhua 发表于 2019-8-15 03:36:29

在3维的情况下,21#的担心成为现实,会有两个对顶小正方体分居球面内外,公共顶点刚好位于球面上。
也会有小正方体的中心正好位于球面上。\总是有解的,记解数为`t_n`,不知有无现成的数列。

chyanog 发表于 2019-8-15 15:50:23

本帖最后由 chyanog 于 2019-8-15 17:59 编辑


迭代次数,球外,球上,球内的方块的个数
{1, 0, 20, 0}
{2, 140, 216, 44}
{3, 4456, 1224, 2320}
{4, 97232, 7968, 54800}
{5, 1999432, 54456, 1146112}
{6, 40353584, 367944, 23278472}

chyanog 发表于 2019-12-2 18:43:43

本帖最后由 chyanog 于 2019-12-2 19:35 编辑

chyanog 发表于 2019-8-15 15:50
迭代次数,球外,球上,球内的方块的个数
{1, 0, 20, 0}
{2, 140, 216, 44}


更新到第8项
(1), 0, 20, 0
(2), 140, 216, 44
(3), 4456, 1224, 2320
(4), 97232, 7968, 54800
(5), 1999432, 54456, 1146112
(6), 40353584, 367944, 23278472
(7), 809527216, 2444520, 468028264
(8), 16206910376, 16284576, 9376805048

代码没有根据对称性作优化,时间复杂度O(20^n),还有很大优化空间,计算到第8项需要十五六分钟。
#include <stdio.h>
#include <math.h>
#include <time.h>

#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))

unsigned __int64 in_count, out_count;

void f(double x, double y, double z, int m, int n)
{
        double d = 2 * pow(3, -n);
        if (n == 0)
        {
                double r = pow(3, -m);
                double d1, d2, d3, d4, d5, d6, d7, d8;
                d1 = pow(x + r, 2) + pow(y + r, 2) + pow(z + r, 2);
                d2 = pow(x + r, 2) + pow(y + r, 2) + pow(z - r, 2);
                d3 = pow(x + r, 2) + pow(y - r, 2) + pow(z + r, 2);
                d4 = pow(x + r, 2) + pow(y - r, 2) + pow(z - r, 2);
                d5 = pow(x - r, 2) + pow(y + r, 2) + pow(z + r, 2);
                d6 = pow(x - r, 2) + pow(y + r, 2) + pow(z - r, 2);
                d7 = pow(x - r, 2) + pow(y - r, 2) + pow(z + r, 2);
                d8 = pow(x - r, 2) + pow(y - r, 2) + pow(z - r, 2);
                if (MAX(MAX(MAX(MAX(MAX(MAX(MAX(d1, d2), d3), d4), d5), d6), d7), d8) < 1)
                {
                        in_count++;
                }
                if (MIN(MIN(MIN(MIN(MIN(MIN(MIN(d1, d2), d3), d4), d5), d6), d7), d8) > 1)
                {
                        out_count++;
                }
        }
        else
        {
                f(x - d, y - d, z - d, m, n - 1);
                f(x - d, y - d, z, m, n - 1);
                f(x - d, y - d, z + d, m, n - 1);
                f(x - d, y, z - d, m, n - 1);
                f(x - d, y, z + d, m, n - 1);
                f(x - d, y + d, z - d, m, n - 1);
                f(x - d, y + d, z, m, n - 1);
                f(x - d, y + d, z + d, m, n - 1);
                f(x, y - d, z - d, m, n - 1);
                f(x, y - d, z + d, m, n - 1);
                f(x, y + d, z - d, m, n - 1);
                f(x, y + d, z + d, m, n - 1);
                f(x + d, y - d, z - d, m, n - 1);
                f(x + d, y - d, z, m, n - 1);
                f(x + d, y - d, z + d, m, n - 1);
                f(x + d, y, z - d, m, n - 1);
                f(x + d, y, z + d, m, n - 1);
                f(x + d, y + d, z - d, m, n - 1);
                f(x + d, y + d, z, m, n - 1);
                f(x + d, y + d, z + d, m, n - 1);
        }
}

int main()
{
        clock_t t0 = clock();
        for (int i = 1; i <= 6; i++)
        {
                in_count = 0;
                out_count = 0;
                f(0, 0, 0, i, i);
                printf("(%d), %llu, %llu, %llu\n", i, out_count, (__int64)pow(20, i) - out_count - in_count, in_count);
        }
        printf("Elapsed time %0.4fs\n", (clock() - t0) / 1000.0);
        return 0;
}

Ickiverar 发表于 2019-12-5 22:58:09

嗯?又被挖出来了。
需要我写用于三维的代码吗:lol

mathe 发表于 2019-12-6 07:33:36

这个序列会需要更多数据

mathe 发表于 2019-12-8 09:59:41

https://oeis.org/A329302
页: 1 2 3 4 [5] 6
查看完整版本: 谢尔宾斯基地毯与圆的交集