LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
lglg.h 文件参考
#include "longlong.h"
#include "../lmmp.h"
#include <stdint.h>
+ lglg.h 的引用(Include)关系图:
+ 此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

宏定义

#define adj_H   0x200000
 
#define H   0x400000
 
#define tab(i)   log2_fix32_q9[i - 1]
 

函数

static uint64_t log2_fac_ceil (uint32_t n)
 计算 log2(n!)的ceil值
 
static uint64_t log2_fac_floor (uint32_t n)
 计算 log2(n!)的floor值
 
static uint64_t log2n_2n1_ceil (uint32_t n)
 计算(2n+1)*log2(n)的ceil值
 
static uint64_t log2n_2n1_floor (uint32_t n)
 计算(2n+1)*log2(n)的floor值
 
static uint64_t mul_log2e_1_ceil (uint32_t n)
 计算 n * (log2(e)-1)
 
static uint64_t mul_log2e_1_floor (uint32_t n)
 计算 n * (log2(e)-1)
 
static uint64_t xlog2n_ceil (uint32_t x, uint32_t n)
 计算x*log2(n)的ceil值
 

变量

const uint32_t log2_fix32_q9 [512]
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 

宏定义说明

◆ adj_H

#define adj_H   0x200000

在文件 lglg.h30 行定义.

◆ H

#define H   0x400000

在文件 lglg.h29 行定义.

◆ tab

#define tab (   i)    log2_fix32_q9[i - 1]

在文件 lglg.h28 行定义.

函数说明

◆ log2_fac_ceil()

static uint64_t log2_fac_ceil ( uint32_t  n)
inlinestatic

计算 log2(n!)的ceil值

参数
n底数
警告
n > 2
返回
log2(n!)的ceil值

在文件 lglg.h241 行定义.

241 {
242 uint64_t r3 = (uint64_t)n << 26;
243 uint64_t r4 = mul_log2e_1_floor(n);
244
245 r4 >>= 6;
246 uint64_t r = log2n_2n1_ceil(n);
247 r -= (r3 + r4) * 2;
248 r += 177938894; // 177938894 = ceil(log2(2pi)*2^26)
249 int adj = (r & 0x3FFFFFF) ? 1 : 0;
250 r >>= 26;
251 return (1 + r) / 2 + adj;
252}
static uint64_t log2n_2n1_ceil(uint32_t n)
计算(2n+1)*log2(n)的ceil值
Definition lglg.h:121
static uint64_t mul_log2e_1_floor(uint32_t n)
计算 n * (log2(e)-1)
Definition lglg.h:229
#define r3
#define n
#define r4

引用了 log2n_2n1_ceil(), mul_log2e_1_floor(), n, r3 , 以及 r4.

被这些函数引用 fac_size_bigger(), lmmp_2factorial_size_(), lmmp_factorial_size_(), lmmp_nCr_size_() , 以及 lmmp_nPr_size_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ log2_fac_floor()

static uint64_t log2_fac_floor ( uint32_t  n)
inlinestatic

计算 log2(n!)的floor值

参数
n底数
警告
n > 2
返回
log2(n!)的floor值

在文件 lglg.h260 行定义.

260 {
261 uint64_t r3 = (uint64_t)n << 26;
262 uint64_t r4 = mul_log2e_1_ceil(n);
263
264 r4 >>= 6;
265 uint64_t r = log2n_2n1_floor(n);
266 r -= (r3 + r4) * 2;
267 r += 177938893; // 177938893 = floor(log2(2pi)*2^26)
268 r >>= 26;
269 return r / 2;
270}
static uint64_t log2n_2n1_floor(uint32_t n)
计算(2n+1)*log2(n)的floor值
Definition lglg.h:176
static uint64_t mul_log2e_1_ceil(uint32_t n)
计算 n * (log2(e)-1)
Definition lglg.h:219

引用了 log2n_2n1_floor(), mul_log2e_1_ceil(), n, r3 , 以及 r4.

被这些函数引用 fac_size_lower(), lmmp_2factorial_size_(), lmmp_nCr_size_() , 以及 lmmp_nPr_size_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ log2n_2n1_ceil()

static uint64_t log2n_2n1_ceil ( uint32_t  n)
inlinestatic

计算(2n+1)*log2(n)的ceil值

参数
n底数
警告
n>1
返回
(2n+1)*log2(n)的定点数格式,低位26位为小数

在文件 lglg.h121 行定义.

121 {
122 uint32_t x = n;
123 int msb;
124 clz_shl_u32(n, n, msb);
125 n &= 0x7fffffff;
126 uint32_t idx = n >> 22;
127
128 uint32_t idx1 = (idx) << 22;
129 uint32_t idx2 = (idx + 1) << 22;
130
131 uint64_t r, r2;
132 if ((idx != 511 && 2 * n >= (idx1 + idx2)) || idx == 0 || idx == 1) {
133 // 使用右边两个插值点进行插值
134 uint64_t y1 = tab(idx + 1);
135 uint64_t y2 = tab(idx + 2);
136 idx1 = (idx + 1) << 22;
137 idx2 = (idx + 2) << 22;
138 int32_t x2x = idx2 - n;
139 int32_t x1x = idx1 - n;
140
141 r = (y1 * x2x - y2 * x1x);
142 r /= H;
143 } else {
144 // 使用左边两个插值点进行插值
145 uint64_t y1 = tab(idx - 1);
146 uint64_t y2 = tab(idx);
147 idx1 = (idx - 1) << 22;
148 idx2 = (idx) << 22;
149 int32_t x2x = n - idx2;
150 int32_t x1x = n - idx1;
151
152 r = (y2 * x1x - y1 * x2x);
153 r /= H;
154 r = (r >= 0x100000000) ? 0xffffffff : r;
155 }
156 /*
157 n = x = n' * 2^k,k = 31 - msb
158 我们要计算的是 (2n+1)log2(n) 即 (2x+1)log2(n') + (2x+1)*k
159 */
160 r2 = r >> 6;
161 r *= x;
162 r >>= 6;
163 uint64_t ret = 2 * r + r2;
164 uint64_t x64 = (uint64_t)x * 2 + 1;
165 x64 *= (31 - msb);
166 x64 <<= 26;
167 return ret + x64;
168}
#define tab(i)
Definition lglg.h:28
#define H
Definition lglg.h:29
#define clz_shl_u32(r, x, cnt)
Definition longlong.h:161
#define r2

引用了 clz_shl_u32, H, n, r2 , 以及 tab.

被这些函数引用 log2_fac_ceil().

+ 这是这个函数的调用关系图:

◆ log2n_2n1_floor()

static uint64_t log2n_2n1_floor ( uint32_t  n)
inlinestatic

计算(2n+1)*log2(n)的floor值

参数
n底数
警告
n>1
返回
(2n+1)*log2(n)的定点数格式,低位26位为小数

在文件 lglg.h176 行定义.

176 {
177 uint32_t x = n;
178 int msb;
179 clz_shl_u32(n, n, msb);
180 n &= 0x7fffffff;
181 uint32_t idx = n >> 22;
182
183 uint32_t idx1 = (idx) << 22;
184 // 直接取相邻两点插值,此时,插值线性函数必定在log2(x)下方
185 uint64_t r, r2, y1, y2;
186 if (idx == 0) {
187 // 索引0对应的值即log2(1+(0)/512) * 2^32 = 0
188 y1 = 0;
189 y2 = tab(1);
190 } else {
191 y1 = tab(idx);
192 y2 = tab(idx + 1);
193 y2 -= y1;
194 }
195 uint32_t x1x = n - idx1;
196 r = y2 * x1x / H;
197 r += y1;
198 /*
199 n = x = n' * 2^k,k = 31 - msb
200 我们要计算的是 (2n+1)log2(n) 即 (2x+1)log2(n') + (2x+1)*k
201 */
202 r2 = r >> 6;
203 r *= x;
204 r >>= 6;
205 uint64_t ret = 2 * r + r2;
206 uint64_t x64 = (uint64_t)x * 2 + 1;
207 x64 *= (31 - msb);
208 x64 <<= 26;
209 return ret + x64;
210}

引用了 clz_shl_u32, H, n, r2 , 以及 tab.

被这些函数引用 log2_fac_floor().

+ 这是这个函数的调用关系图:

◆ mul_log2e_1_ceil()

static uint64_t mul_log2e_1_ceil ( uint32_t  n)
inlinestatic

计算 n * (log2(e)-1)

返回
n * (log2(e)-1)的定点数格式,低位32位为小数

在文件 lglg.h219 行定义.

219 {
220 uint64_t r = 1901360723; // ceil((log2(e)-1)*2^32)
221 r *= n;
222 return r;
223}

引用了 n.

被这些函数引用 log2_fac_floor().

+ 这是这个函数的调用关系图:

◆ mul_log2e_1_floor()

static uint64_t mul_log2e_1_floor ( uint32_t  n)
inlinestatic

计算 n * (log2(e)-1)

返回
n * (log2(e)-1)的定点数格式,低位32位为小数

在文件 lglg.h229 行定义.

229 {
230 uint64_t r = 1901360722; // floor((log2(e)-1)*2^32)
231 r *= n;
232 return r;
233}

引用了 n.

被这些函数引用 log2_fac_ceil().

+ 这是这个函数的调用关系图:

◆ xlog2n_ceil()

static uint64_t xlog2n_ceil ( uint32_t  x,
uint32_t  n 
)
inlinestatic

计算x*log2(n)的ceil值

参数
n底数
x乘数
警告
MSB(n)=1
注解
大约产生10^-7相对误差
返回
n*log2(x)的ceil值

在文件 lglg.h67 行定义.

67 {
68 /*
69 此函数虽然大部分计算和log2n_2n1_ceil相同,但后者由于有其他函数配合误差控制,
70 在这个函数中,为了保证不低估,我们使用了更加严格的计算,比如使用adj_H来调控
71 除以H时的除法误差,并且末尾的调整也更加严格。
72 */
73 n &= 0x7fffffff;
74 uint32_t idx = n >> 22;
75
76 uint32_t idx1 = (idx) << 22;
77 uint32_t idx2 = (idx + 1) << 22;
78
79 uint64_t r;
80 uint64_t x64 = (uint64_t)x;
81 if ((idx != 511 && 2 * n >= (idx1 + idx2)) || idx == 0 || idx == 1) {
82 // 使用右边两个插值点进行插值
83 uint64_t y1 = tab(idx + 1);
84 uint64_t y2 = tab(idx + 2);
85 idx1 = (idx + 1) << 22;
86 idx2 = (idx + 2) << 22;
87 int32_t x2x = idx2 - n;
88 int32_t x1x = idx1 - n;
89 r = (y1 * x2x - y2 * x1x);
90 r += adj_H;
91 r /= H;
92 } else {
93 // 使用左边两个插值点进行插值
94 uint64_t y1 = tab(idx - 1);
95 uint64_t y2 = tab(idx);
96 idx1 = (idx - 1) << 22;
97 idx2 = (idx) << 22;
98 int32_t x2x = n - idx2;
99 int32_t x1x = n - idx1;
100 r = (y2 * x1x - y1 * x2x);
101 r += adj_H;
102 r /= H;
103 // 这是插值结果可能高过log2(2),我们直接截断数据
104 r = (r >= 0x100000000) ? 0x100000000 : r;
105 }
106 r *= x;
107 r >>= 6;
108 x64 *= 31;
109 x64 <<= 26;
110 r += x64;
111 int adj = (r & 0x3FFFFFF) ? 2 : 1;
112 return (r >> 26) + adj;
113}
#define adj_H
Definition lglg.h:30

引用了 adj_H, H, n , 以及 tab.

被这些函数引用 lmmp_pow_1_size_() , 以及 lmmp_pow_size_().

+ 这是这个函数的调用关系图:

变量说明

◆ log2_fix32_q9

const uint32_t log2_fix32_q9[512]
extern

Copyright (C) 2026 HJimmyK(Jericho Knox)

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

在文件 lglg.c18 行定义.

18 {
19 0x00B87C20, 0x01709C47, 0x022860D0, 0x02DFCA17, 0x0396D875, 0x044D8C46, 0x0503E5E2, 0x05B9E5A1, 0x066F8BDE,
20 0x0724D8EF, 0x07D9CD2B, 0x088E68EB, 0x0942AC83, 0x09F6984A, 0x0AAA2C96, 0x0B5D69BB, 0x0C10500D, 0x0CC2DFE2,
21 0x0D75198B, 0x0E26FD5D, 0x0ED88BA9, 0x0F89C4C2, 0x103AA8F9, 0x10EB38A0, 0x119B7407, 0x124B5B7E, 0x12FAEF56,
22 0x13AA2FDD, 0x14591D63, 0x1507B836, 0x15B600A4, 0x1663F6FB, 0x17119B87, 0x17BEEE97, 0x186BF075, 0x1918A16E,
23 0x19C501CE, 0x1A7111DF, 0x1B1CD1ED, 0x1BC84241, 0x1C736325, 0x1D1E34E3, 0x1DC8B7C5, 0x1E72EC11, 0x1F1CD212,
24 0x1FC66A0F, 0x206FB44F, 0x2118B11A, 0x21C160B6, 0x2269C369, 0x2311D97A, 0x23B9A32F, 0x246120CC, 0x25085296,
25 0x25AF38D2, 0x2655D3C5, 0x26FC23B1, 0x27A228DB, 0x2847E386, 0x28ED53F3, 0x29927A66, 0x2A375721, 0x2ADBEA65,
26 0x2B803474, 0x2C24358F, 0x2CC7EDF6, 0x2D6B5DE9, 0x2E0E85AA, 0x2EB16577, 0x2F53FD90, 0x2FF64E33, 0x309857A0,
27 0x313A1A15, 0x31DB95D0, 0x327CCB0F, 0x331DBA0F, 0x33BE630D, 0x345EC646, 0x34FEE3F7, 0x359EBC5B, 0x363E4FAF,
28 0x36DD9E2F, 0x377CA814, 0x381B6D9C, 0x38B9EEFF, 0x39582C79, 0x39F62643, 0x3A93DC98, 0x3B314FB1, 0x3BCE7FC7,
29 0x3C6B6D14, 0x3D0817CF, 0x3DA48031, 0x3E40A672, 0x3EDC8ACB, 0x3F782D72, 0x40138E9F, 0x40AEAE89, 0x41498D67,
30 0x41E42B6F, 0x427E88D7, 0x4318A5D5, 0x43B282A0, 0x444C1F6B, 0x44E57C6D, 0x457E99DB, 0x461777E8, 0x46B016CA,
31 0x474876B5, 0x47E097DB, 0x48787A72, 0x49101EAC, 0x49A784BD, 0x4A3EACD7, 0x4AD5972D, 0x4B6C43F1, 0x4C02B356,
32 0x4C98E58E, 0x4D2EDAC9, 0x4DC4933B, 0x4E5A0F13, 0x4EEF4E83, 0x4F8451BB, 0x501918EC, 0x50ADA447, 0x5141F3FB,
33 0x51D60839, 0x5269E12F, 0x52FD7F0E, 0x5390E204, 0x54240A40, 0x54B6F7F1, 0x5549AB46, 0x55DC246D, 0x566E6393,
34 0x570068E8, 0x57923498, 0x5823C6D1, 0x58B51FC0, 0x59463F92, 0x59D72674, 0x5A67D492, 0x5AF84A1A, 0x5B888736,
35 0x5C188C14, 0x5CA858DF, 0x5D37EDC3, 0x5DC74AEA, 0x5E567081, 0x5EE55EB1, 0x5F7415A7, 0x6002958C, 0x6090DE8C,
36 0x611EF0CF, 0x61ACCC81, 0x623A71CC, 0x62C7E0D8, 0x635519CF, 0x63E21CDB, 0x646EEA24, 0x64FB81D5, 0x6587E415,
37 0x6614110C, 0x66A008E4, 0x672BCBC5, 0x67B759D6, 0x6842B340, 0x68CDD82A, 0x6958C8BB, 0x69E3851C, 0x6A6E0D72,
38 0x6AF861E6, 0x6B82829D, 0x6C0C6FC0, 0x6C962973, 0x6D1FAFDD, 0x6DA90325, 0x6E322370, 0x6EBB10E4, 0x6F43CBA8,
39 0x6FCC53DF, 0x7054A9B1, 0x70DCCD41, 0x7164BEB5, 0x71EC7E31, 0x72740BDB, 0x72FB67D7, 0x73829249, 0x74098B55,
40 0x74905320, 0x7516E9CD, 0x759D4F81, 0x7623845E, 0x76A98888, 0x772F5C23, 0x77B4FF51, 0x783A7236, 0x78BFB4F4,
41 0x7944C7AF, 0x79C9AA88, 0x7A4E5DA2, 0x7AD2E11F, 0x7B573522, 0x7BDB59CD, 0x7C5F4F40, 0x7CE3159F, 0x7D66AD0A,
42 0x7DEA15A3, 0x7E6D4F8B, 0x7EF05AE4, 0x7F7337CE, 0x7FF5E66A, 0x807866D9, 0x80FAB93C, 0x817CDDB2, 0x81FED45D,
43 0x82809D5C, 0x830238D0, 0x8383A6D8, 0x8404E794, 0x8485FB24, 0x8506E1A8, 0x85879B3E, 0x86082807, 0x86888820,
44 0x8708BBAA, 0x8788C2C4, 0x88089D8B, 0x88884C1E, 0x8907CE9D, 0x89872525, 0x8A064FD5, 0x8A854ECB, 0x8B042225,
45 0x8B82CA00, 0x8C01467C, 0x8C7F97B4, 0x8CFDBDC8, 0x8D7BB8D3, 0x8DF988F5, 0x8E772E49, 0x8EF4A8ED, 0x8F71F8FE,
46 0x8FEF1E98, 0x906C19DA, 0x90E8EADE, 0x916591C1, 0x91E20EA1, 0x925E6199, 0x92DA8AC6, 0x93568A43, 0x93D2602C,
47 0x944E0C9E, 0x94C98FB4, 0x9544E989, 0x95C01A3A, 0x963B21E1, 0x96B6009B, 0x9730B681, 0x97AB43AF, 0x9825A841,
48 0x989FE451, 0x9919F7F9, 0x9993E356, 0x9A0DA680, 0x9A874193, 0x9B00B4A8, 0x9B79FFDB, 0x9BF32346, 0x9C6C1F01,
49 0x9CE4F329, 0x9D5D9FD5, 0x9DD62520, 0x9E4E8325, 0x9EC6B9FB, 0x9F3EC9BD, 0x9FB6B284, 0xA02E746A, 0xA0A60F87,
50 0xA11D83F5, 0xA194D1CC, 0xA20BF926, 0xA282FA1C, 0xA2F9D4C5, 0xA370893B, 0xA3E71797, 0xA45D7FEF, 0xA4D3C25E,
51 0xA549DEFC, 0xA5BFD5DF, 0xA635A721, 0xA6AB52DA, 0xA720D920, 0xA7963A0D, 0xA80B75B8, 0xA8808C38, 0xA8F57DA5,
52 0xA96A4A17, 0xA9DEF1A5, 0xAA537465, 0xAAC7D270, 0xAB3C0BDC, 0xABB020C1, 0xAC241135, 0xAC97DD4F, 0xAD0B8526,
53 0xAD7F08D1, 0xADF26866, 0xAE65A3FB, 0xAED8BBA8, 0xAF4BAF83, 0xAFBE7FA1, 0xB0312C19, 0xB0A3B502, 0xB1161A70,
54 0xB1885C7B, 0xB1FA7B37, 0xB26C76BC, 0xB2DE4F1D, 0xB3500472, 0xB3C196D0, 0xB433064B, 0xB4A452FB, 0xB5157CF3,
55 0xB5868449, 0xB5F76913, 0xB6682B64, 0xB6D8CB54, 0xB74948F5, 0xB7B9A45E, 0xB829DDA3, 0xB899F4D9, 0xB909EA14,
56 0xB979BD69, 0xB9E96EEC, 0xBA58FEB2, 0xBAC86CD0, 0xBB37B959, 0xBBA6E462, 0xBC15EDFF, 0xBC84D644, 0xBCF39D45,
57 0xBD624315, 0xBDD0C7CA, 0xBE3F2B76, 0xBEAD6E2D, 0xBF1B9003, 0xBF89910C, 0xBFF7715B, 0xC0653103, 0xC0D2D019,
58 0xC1404EAE, 0xC1ADACD7, 0xC21AEAA6, 0xC2880830, 0xC2F50586, 0xC361E2BB, 0xC3CE9FE4, 0xC43B3D12, 0xC4A7BA58,
59 0xC51417CA, 0xC5805579, 0xC5EC7378, 0xC65871DA, 0xC6C450B2, 0xC7301011, 0xC79BB00A, 0xC80730B0, 0xC8729214,
60 0xC8DDD449, 0xC948F761, 0xC9B3FB6D, 0xCA1EE080, 0xCA89A6AC, 0xCAF44E03, 0xCB5ED695, 0xCBC94076, 0xCC338BB7,
61 0xCC9DB869, 0xCD07C69E, 0xCD71B667, 0xCDDB87D6, 0xCE453AFC, 0xCEAECFEB, 0xCF1846B3, 0xCF819F66, 0xCFEADA16,
62 0xD053F6D2, 0xD0BCF5AD, 0xD125D6B7, 0xD18E9A01, 0xD1F73F9C, 0xD25FC799, 0xD2C83209, 0xD3307EFB, 0xD398AE81,
63 0xD400C0AC, 0xD468B58C, 0xD4D08D31, 0xD53847AC, 0xD59FE50D, 0xD6076565, 0xD66EC8C3, 0xD6D60F39, 0xD73D38D5,
64 0xD7A445A9, 0xD80B35C4, 0xD8720936, 0xD8D8C00F, 0xD93F5A60, 0xD9A5D837, 0xDA0C39A5, 0xDA727EBA, 0xDAD8A784,
65 0xDB3EB415, 0xDBA4A47B, 0xDC0A78C5, 0xDC703104, 0xDCD5CD47, 0xDD3B4D9D, 0xDDA0B215, 0xDE05FAC0, 0xDE6B27AB,
66 0xDED038E6, 0xDF352E81, 0xDF9A088A, 0xDFFEC711, 0xE0636A24, 0xE0C7F1D2, 0xE12C5E2B, 0xE190AF3D, 0xE1F4E517,
67 0xE258FFC8, 0xE2BCFF5E, 0xE320E3E8, 0xE384AD75, 0xE3E85C13, 0xE44BEFD0, 0xE4AF68BD, 0xE512C6E5, 0xE5760A59,
68 0xE5D93326, 0xE63C415B, 0xE69F3506, 0xE7020E35, 0xE764CCF7, 0xE7C77159, 0xE829FB69, 0xE88C6B36, 0xE8EEC0CE,
69 0xE950FC3E, 0xE9B31D94, 0xEA1524DF, 0xEA77122B, 0xEAD8E588, 0xEB3A9F02, 0xEB9C3EA7, 0xEBFDC485, 0xEC5F30A9,
70 0xECC08322, 0xED21BBFC, 0xED82DB45, 0xEDE3E10B, 0xEE44CD5A, 0xEEA5A041, 0xEF0659CC, 0xEF66FA08, 0xEFC78104,
71 0xF027EECC, 0xF088436D, 0xF0E87EF5, 0xF148A170, 0xF1A8AAEC, 0xF2089B75, 0xF2687319, 0xF2C831E4, 0xF327D7E4,
72 0xF3876524, 0xF3E6D9B2, 0xF446359B, 0xF4A578EB, 0xF504A3AF, 0xF563B5F4, 0xF5C2AFC6, 0xF6219132, 0xF6805A44,
73 0xF6DF0B09, 0xF73DA38E, 0xF79C23DE, 0xF7FA8C05, 0xF858DC12, 0xF8B7140F, 0xF9153409, 0xF9733C0C, 0xF9D12C24,
74 0xFA2F045E, 0xFA8CC4C6, 0xFAEA6D67, 0xFB47FE4F, 0xFBA57787, 0xFC02D91E, 0xFC60231E, 0xFCBD5594, 0xFD1A708C,
75 0xFD777410, 0xFDD4602E, 0xFE3134F1, 0xFE8DF264, 0xFEEA9893, 0xFF47278B, 0xFFA39F56, 0xFFFFFFFF};